从舞台AS3中删除影片剪辑的所有实例

时间:2015-04-18 18:44:58

标签: actionscript-3 flash movieclip children

我试图在我的光标后面有一些点,但我不能删除旧的点,所以最终发生的事情就是我在网格上得到了很多点。我尝试过removeChild和其他一些方法,但它们都没有用。 这段代码的2部分因为我希望在它们之间交替,所以可以在运行时删除/删除另一部分。所有这些都包含在每半秒运行一次的计时器中。

if(radius<8 && counter%2!=0){
    xCoord = ((radius*Math.cos(theta))*25)+275;
    yCoord = ((radius*Math.sin(theta))*(-1)*25)+225;
    for(dots = 1; dots<=ship; dots++){
        var dotInstance2:dot = new dot();
        dotSprite2.addChild(dotInstance2);
        mcArray2.push(dotInstance2);
        dotInstance2.x=xCoord;
        dotInstance2.y=yCoord;
        xCoord = ((xCoord-275)/25);
        yCoord = ((yCoord-225)/25)*(-1);
        theta = Math.atan(yCoord/xCoord)-(15*(Math.PI/180));
        if(xCoord<0){
            theta = theta + Math.PI;
        }
        xCoord = ((radius*Math.cos(theta))*25)+275;
        yCoord = ((radius*Math.sin(theta))*(-1)*25)+225;
    }
}

点应该捕捉到极地网格(我已经完成并且有效)我只需要能够在舞台上有多个“船”(数字)点后删除旧点

没有测试方法可以删除此代码中的实例,因为它们都不起作用。 我试过的是将实例添加到数组并使用removeChild和removeChildAt从数组中删除所有值,同时尝试删除我拥有的精灵(本例中为dotSprite2)

2 个答案:

答案 0 :(得分:0)

function removeDots(num:Number){
  for (var i:int=0; i<num; i++){        
    var dotInst:dot = mcArray2.shift();
    dotSprite2.removeChild(dotInst);
  }
}

这应该有效。如果没有,似乎点上有任何引用/听众, 你没有在你的代码中显示它们。

答案 1 :(得分:0)

将点放入数组是正确的方法,我会这样做

var dots:Array = new Array() //your array that holds dots
var dotsSprite:Sprite = new Sprite() //the sprite that holds the dots in its displaylist
addChild(dotsSprite);

//when you create your dots
var dot = new dot();
dots.push(dot);
dotsSprite.addChild(dot);

//to destroy the first dot in your array (the oldest dot)
dotsSprite.removeChild(dots.shift());

数组的shift()方法删除数组中的第一个条目,并将其他条目向左移一步(因此位置1变为0,2变为1等)。它还返回有问题的对象,因此我们可以将其作为参数直接传递给dotsSprite.removeChild(),因此它将从其父级displayylist中删除。

你的问题并不是很清楚,所以我认为你没有尝试从你的dotsSprite2中删除孩子,而是试图从你的代码运行时删除它removeChild((the dot))

基本上,你的计时器方法应该是这样的

function tick(e:TimerEvent):void{
    //this is the event listener for the timer you mentioned
    //first we should check if there are old dots already on the stage
    //we can set the amount of old dots that should stay before they're removed
    if(dots.length>(amount of old dots you want to stay){
        //remove a dot in this timer tick
        dotsSprite.removeChild(dots.shift());
    }

    //then create a new dot, unless one at the current location already exists
}

这仍然可以改进,例如你可以定义点的生命周期,一个点可以在舞台上的时间量。为此,我建议这样的事情:

在你的创造和破坏点的班级

const dot_life_time:int = 3000; //3000ms = 3s

在你的Dot Class中

public var created:int = 0;

创建Dots时,通过Flash的getTimer()方法为它们提供swf的当前运行时间(以毫秒为单位)

//the dot creation part comes here
dot.created = getTimer();
//add it to the sprite and array

现在,不应检查数组是否超过特定长度,而应检查数组中的每个点并检查其时间是否结束

function tick(e:TimerEvent):void{
    for(var i:int=0;i<dots.length;i++){
        var elapsed:int = getTimer() - dots[i].created;
        if(elapsed >= dot_life_time){
            //destroy the dot
        }
    }

    //then, check if the current location already has a dot, if not, add one
}

这一切都是未经测试的,只是从我的头脑中,但我希望你得到我所说的一般要点。