如何从随机数组中删除 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

上操作

对于它的价值,您可以通过计算具有适当间隔(包含区域和排除区域之间的差异)的随机值并导出 xy 坐标来完全避免试验循环从那个。

下面的代码(用我不懂的语言写的,语法错误请见谅)有两种情况。 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 设置为被该形状完全包围的最大矩形,以避免许多但不是所有的重试情况。这对于大形状和许多点很有帮助。或者有一些变化可以完美地适应另一种形状(例如,椭圆)。