如何使某个物体在某一点消失as3

时间:2013-02-11 05:34:59

标签: actionscript-3 enterframeevent

我有一个名为food的影片剪辑,我将其放入一个名为foodArray的数组中。它有自己的类(名为Mover),使每个食物向右移动。当它到达某一点时,食物就会消失。

这是让我放入Main课程的食物消失的代码。我把它放在Enter Frame上。

var l:int = foodArray.length - 1;
while ((l > -1))
{
    if (foodArray[l].x > 1020)
    {
        removeChild(foodArray[l]);
        foodArray.splice(l,1);
    }
    l = l - 1;
}

这是Mover类

public function Mover(inputMC:MovieClip, xV:Number)
{
    this.insMC = inputMC;
    this.xVel = xV;
}
public function startMove():void
{
    this.insMC.addEventListener(Event.ENTER_FRAME, this.updatePos);
}
protected function updatePos(e: Event):void
{
    this.insMC.x +=  this.xVel;
}
public function stopMove():void
{
    this.insMC.removeEventListener(Event.ENTER_FRAME, this.updatePos);
}

食物消失得很好,但是有些食物即使在它应该消失之后仍然继续存在。 我猜测问题在于数组长度,但我无法确定。将非常感谢帮助。 :)

这是我制作前十一种食物的地方。所以我有一个名为Food的movieclip,它在每个时间轴上有六张不同的图片。我想做一排随机食物。

function showFood()
{
    const ROW = 11;
    for (foodSeq = 0; foodSeq < ROW; foodSeq++)
    {
        randomFood = Math.ceil(Math.random() * 6);
        food = new Food();
        food.gotoAndStop(randomFood);
        food.x = 1010 - (84 * (foodSeq % ROW));
        food.y = 675;
        addChild(food);
        foodArray.push(food);
        food.sequence = foodSeq;
        food.code = randomFood;
        food.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
        //mover
        mover = new Mover(food,XVEL);
        moverArr.push(mover);
        mover.startMove();
    }
    addFood();
}

在这里,我一次添加一种食物

function addFood()
{
    randomFood = Math.ceil(Math.random() * 6);
    food = new Food();
    food.gotoAndStop(randomFood);
    food.x = 76;
    food.y = 675;
    addChild(food);
    foodArray.push(food);
    food.sequece = foodSeq;
    food.code = randomFood;
    food.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
    foodSeq++;
    //mover
    mover = new Mover(food,XVEL);
    moverArr.push(mover);
    mover.startMove();
    //timer
    timerFood.reset();
    timerFood.addEventListener(TimerEvent.TIMER, timerForFood);
    timerFood.start();
}

这是触发addFood函数的计时器

function timerForFood(t: TimerEvent)
{
    if (timerFood.currentCount > 2)
    {
        addFood();
    }
}

1 个答案:

答案 0 :(得分:1)

我会做一些改变。首先,您可以从Mover中删除事件侦听器,然后从while循环中调用update方法 - 这样您就不必拥有多个输入框架侦听器(因为我看不到您删除任何侦听器,我假设你有很多内存泄漏。

我也会跳过那个向后循环,因为它只是丑陋并且使代码更难理解:)虽然它的速度要快一点,但除非你在阵列中有数千个项目,否则无关紧要。

for (var i:int = 0; i<foodArray.length; i++) {
    var food:Mover = foodArray[i];
    food.updatePos(); // Remove the parameters from the updatePos method, since you're not using it any more.
    if (food.x > 1020) {
        foodArray.splice(i,1);
        i--;
    }
 }

话虽如此,我看不出任何明显错误的代码(除非你的后向循环中有一些奇怪的东西),所以请发布更多代码。