如何从随机数组中删除 child?
How to remove a child from a random array?
我有一个随机创建 10 个点的数组。但是,在某些区域我不希望创建它们。我怎样才能做到这一点?我的代码显示错误 2025。
"The supplied DisplayObject must be a child of the caller."
偶尔会按照指示输出totalDots,(trace""+totalDots)
,但90%的时候都会报错。
public var numDots:Array = [];
public var totalDots:int = numDots.length;
public var box:Box = new Box();
public function addBox():void
{
box.x = stageWidth/2;
box.y = stageHeight/2;
addChild(box);
}
private function addDot():void
{
for(var i:int = 0; i < 10; i++)
{
var dot:Dot = new Dot();
dot.x = Math.floor(Math.random() * stageWidth);
dot.y = Math.floor(Math.random() * stageHeight);
this.addChild(dot);
totalDots++;
trace(""+totalDots);
for(var j:int = 0; j < totalDots; j++)
{
if(numDots[j].hitTestObject(box))
{
stage.removeChild(numDots[j]);
numDots.splice(j, 1);
totalDots--;
}
}
}
}
你的问题是你的嵌套循环。在每次迭代中,您添加一个新点,然后遍历所有现有点,如果它与框碰撞,则将其移除。我不认为那是你打算做的。
看起来你只是想确保点不是在某个区域内添加的。在这种情况下,使用 do while 循环保持简单:
for(var i:int = 0; i < 10; i++)
{
var dot:Dot = new Dot();
this.addChild(dot);
do {
dot.x = Math.floor(Math.random() * stageWidth);
dot.y = Math.floor(Math.random() * stageHeight);
} while(dot.hitTestObject(box))
totalDots++;
trace(""+totalDots);
}
你永远不会在数组中添加任何点。
您可以像这样将点添加到显示列表中:
this.addChild(dot);
你尝试像这样删除它:
stage.removeChild(numDots[j]);
尽管点从未添加到数组中,但即使添加了也是行不通的。那是因为 this
不是 stage
。它们是两个不同的东西。
你应该永远不要使用stage.addChild()
(查看文档了解更多信息)。一直调用addChild()
就相当于this.addChild()
。这确保您始终在同一个 DisplayObjectContainer
上操作
对于它的价值,您可以通过计算具有适当间隔(包含区域和排除区域之间的差异)的随机值并导出 x
和 y
坐标来完全避免试验循环从那个。
下面的代码(用我不懂的语言写的,语法错误请见谅)有两种情况。 if
情况处理点将出现在排除框左侧或右侧的情况,并且 x
值的范围仅限于该框的左侧或右侧。 else
的情况是圆点出现在框的上方或下方,x
值不受限制。
var interval:int = stageWidth * stageHeight - box.w * box.h;
var cut:int = interval - (stageWidth - box.w) * box.h;
for (var i:int = 0; i < 10; i++) {
var r:int = Math.floor(Math.random() * interval);
var x:int;
var y:int;
if (r >= cut) {
r -= cut;
y = r / (stageWidth - box.w);
x = r - y * (stageWidth - box.w);
y += box.y;
if (x >= box.x) x += box.w;
} else {
y = r / stageWidth;
x = r - y * stageWidth;
if (y >= box.y) y += box.h;
}
var dot:Dot = new Dot();
dot.x = x;
dot.y = y;
this.addChild(dot);
totalDots++;
trace(""+totalDots);
}
这假设 box
完全在 stageWidth,stageHeight
内。
同样值得注意的是它允许点重叠;与原代码相同。
对于更复杂的形状,您可以将 box
设置为被该形状完全包围的最大矩形,以避免许多但不是所有的重试情况。这对于大形状和许多点很有帮助。或者有一些变化可以完美地适应另一种形状(例如,椭圆)。
我有一个随机创建 10 个点的数组。但是,在某些区域我不希望创建它们。我怎样才能做到这一点?我的代码显示错误 2025。
"The supplied DisplayObject must be a child of the caller."
偶尔会按照指示输出totalDots,(trace""+totalDots)
,但90%的时候都会报错。
public var numDots:Array = [];
public var totalDots:int = numDots.length;
public var box:Box = new Box();
public function addBox():void
{
box.x = stageWidth/2;
box.y = stageHeight/2;
addChild(box);
}
private function addDot():void
{
for(var i:int = 0; i < 10; i++)
{
var dot:Dot = new Dot();
dot.x = Math.floor(Math.random() * stageWidth);
dot.y = Math.floor(Math.random() * stageHeight);
this.addChild(dot);
totalDots++;
trace(""+totalDots);
for(var j:int = 0; j < totalDots; j++)
{
if(numDots[j].hitTestObject(box))
{
stage.removeChild(numDots[j]);
numDots.splice(j, 1);
totalDots--;
}
}
}
}
你的问题是你的嵌套循环。在每次迭代中,您添加一个新点,然后遍历所有现有点,如果它与框碰撞,则将其移除。我不认为那是你打算做的。
看起来你只是想确保点不是在某个区域内添加的。在这种情况下,使用 do while 循环保持简单:
for(var i:int = 0; i < 10; i++)
{
var dot:Dot = new Dot();
this.addChild(dot);
do {
dot.x = Math.floor(Math.random() * stageWidth);
dot.y = Math.floor(Math.random() * stageHeight);
} while(dot.hitTestObject(box))
totalDots++;
trace(""+totalDots);
}
你永远不会在数组中添加任何点。
您可以像这样将点添加到显示列表中:
this.addChild(dot);
你尝试像这样删除它:
stage.removeChild(numDots[j]);
尽管点从未添加到数组中,但即使添加了也是行不通的。那是因为 this
不是 stage
。它们是两个不同的东西。
你应该永远不要使用stage.addChild()
(查看文档了解更多信息)。一直调用addChild()
就相当于this.addChild()
。这确保您始终在同一个 DisplayObjectContainer
对于它的价值,您可以通过计算具有适当间隔(包含区域和排除区域之间的差异)的随机值并导出 x
和 y
坐标来完全避免试验循环从那个。
下面的代码(用我不懂的语言写的,语法错误请见谅)有两种情况。 if
情况处理点将出现在排除框左侧或右侧的情况,并且 x
值的范围仅限于该框的左侧或右侧。 else
的情况是圆点出现在框的上方或下方,x
值不受限制。
var interval:int = stageWidth * stageHeight - box.w * box.h;
var cut:int = interval - (stageWidth - box.w) * box.h;
for (var i:int = 0; i < 10; i++) {
var r:int = Math.floor(Math.random() * interval);
var x:int;
var y:int;
if (r >= cut) {
r -= cut;
y = r / (stageWidth - box.w);
x = r - y * (stageWidth - box.w);
y += box.y;
if (x >= box.x) x += box.w;
} else {
y = r / stageWidth;
x = r - y * stageWidth;
if (y >= box.y) y += box.h;
}
var dot:Dot = new Dot();
dot.x = x;
dot.y = y;
this.addChild(dot);
totalDots++;
trace(""+totalDots);
}
这假设 box
完全在 stageWidth,stageHeight
内。
同样值得注意的是它允许点重叠;与原代码相同。
对于更复杂的形状,您可以将 box
设置为被该形状完全包围的最大矩形,以避免许多但不是所有的重试情况。这对于大形状和许多点很有帮助。或者有一些变化可以完美地适应另一种形状(例如,椭圆)。