如何从随机数组中删除一个孩子?

时间:2015-05-04 18:05:04

标签: arrays actionscript-3 flash random actionscript

我有一个随机创建10个点的数组。然而,在某个我不希望创建它们的区域。我怎样才能做到这一点?我的代码给了我错误2025.

"提供的DisplayObject必须是调用者的子级。"

它会偶尔按照指示(trace""+totalDots)输出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--;
            }
        }
    }

}

3 个答案:

答案 0 :(得分:3)

你的问题是你的嵌套循环。每次迭代时,添加一个新点,然后遍历所有现有点,如果它与盒子发生碰撞,则将其删除。我认为这不是你打算做的。

看起来你只是想确保在某个区域内没有添加点。在这种情况下,使用do while循环保持简单:

$ find ./servers -type -d -name *log* > excludefiles
$ tar czf ROOT/backup/servers/20150504.tar.gz -X excludefiles ./servers

答案 1 :(得分:1)

您永远不会在阵列中添加任何点。

您可以将点添加到显示列表中,如下所示:

this.addChild(dot);

并尝试将其删除:

stage.removeChild(numDots[j]);

尽管这个点从未添加到数组中,但即使它已经存在,也无法工作。这是因为this不是stage。它们是两回事。

您应该从不使用stage.addChild()(有关详细信息,请查看文档)。只需拨打addChild(),即相当于this.addChild()。这可确保您始终使用同一个DisplayObjectContainer

答案 2 :(得分:0)

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

以下代码(用我不知道的语言编写,如果语法错误而道歉)有两种情况。 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设置为该形状完全包围的最大矩形,以避免许多但不是所有重试情况。这对于大型形状和许多点有用。或者有些变体可以管理与另一种形状的完美契合(例如,椭圆)。