0

以前のゲームでは、フラッシュ ゲームで敵を配列を使用して侵入させました。敵が殺されるか、ステージから移動すると、配列から削除するだけでした。なんらかの理由で、このゲームでまったく同じコードを使用すると、配列オブジェクトを削除しようとすると 1009: エラーがスローされ、基本的にそこには何もないというメッセージが表示されます。. . これは奇妙です。

コードは次のとおりです。

public function addZombie()
{
    var zom:Zombie = new Zombie();
    zom.y = 20;
    zom.x = Math.floor(Math.random()*(1 + 500 - 30)) + 30;
    addChild(zom);
    zombies.push(zom);
    numZombies++;
}

それが追加される関数です。ゾンビは配列であり、この関数の配列にプッシュされます。これを削除しようとしているコードは次のとおりです。

for (var i:int = 0; i < zombies.length; i++)
{
    if (zombies[i].y + zombies[i].height / 2 > 400) {
        removeChild(zombies[i]);
        zombies.splice(i,1);
        numZombies--;
        addZombie();
    }
}

removeChild(ゾンビ[i]); <-- これは、削除しようとしたときにエラーをスローする部分です。それらのいくつかは奇妙に削除されますが、すべてではありません。

4

2 に答える 2

0

ループが期待どおりに機能しているとは思えません。この方法で配列から要素を削除すると、削除された要素の後のすべての要素が下に移動します。したがって、次のようなコードがある場合:

var testArr:Array = new Array();
testArr.push('First');
testArr.push('Second');
testArr.push('Third');
testArr.push('Fourth');

for (var i:int = 0; i < testArr.length; i++) {
    testArr.splice(i,1);
}

ループの結果は次のようになります。

i=0, testArr = ['Second', 'Third', 'Fourth']
i=1, testArr = ['Second', 'Fourth']
i=2 END OF LOOP

while ループを使用して、要素が削除されていない場合にのみインデックスをインクリメントする方がよいでしょう (要素を削除すると、新しい要素がそのインデックス位置に移動するため)。

null オブジェクト参照を取得している理由はわかりませんが、これにより他の問題が発生する可能性があります (すべてではなく一部が削除される理由)。

于 2013-04-05T00:01:46.540 に答える
0

Bill Turner の説明は正しいものですが、問題の解決に役立たないように思われるため、次の方法を試してみてください。

var zombieCount:int = zombies.length;

for (var i:int = 0; i < zombies.length; i++)
{
    var zombie = zombies[i];
    if (zombie.y + (zombie.height / 2) > 400) {
        removeChild(zombie);
        zombies.splice(i,1);
        i--; // So that the loop will pass with the same value next time
        numZombies--;
    }
}

for (var j:int = zombies.length; j < zombieCount; j++)
{
    addZombie();
}
于 2013-04-05T01:13:56.643 に答える