0

foodArray という配列に入れる food というムービー クリップがあります。各食品を右に移動させる独自のクラス (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);
}

食べ物は問題なく消えていますが、消えるはずのポイントを過ぎても動き続ける食べ物があります。問題は配列の長さにあると推測していますが、よくわかりません。助けていただければ幸いです。:)

ここでファーストイレブンフードを作ります。それで、各タイムラインに 6 つの異なる写真を含む Food というムービークリップがあります。ランダムな食べ物の列を作りたいです。

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();
}

そして、ここで一度に 1 つの食品を追加します。

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();
    }
}
4

1 に答える 1

1

いくつか変更を加えます。まず、代わりにwhileループからイベントリスナーを削除しMover、whileループからupdateメソッドを呼び出すことができます-したがって、複数のEnterフレームリスナーを用意する必要はありません(リスナーを削除しているのが見えないので、多くのメモリリーク)。

また、逆方向のループはスキップします。これは、見苦しく、コードを理解しにくくするためです:)少し高速ですが、配列に何千ものアイテムがない限り、問題にはなりません。

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--;
    }
 }

そうは言っても、コードに明らかに問題があることはわかりません(後方ループに何か奇妙なことがない限り)ので、さらにコードを投稿してください。

于 2013-02-11T10:00:13.133 に答える