0

ここに問題があります。5秒ごとにspawnEnemiesが起動されます。ムービークリップを作成し、位置を設定して、ステージと配列に追加します。関数checkBulletで、弾丸が敵の1つに当たったかどうかを確認します。含まれている場合、弾丸と敵はステージから削除され、敵はアレイからスプライスされます。しかし、敵に当たるとエラーがスローされます。

TypeError:エラー#1010:用語が未定義であり、プロパティがありません。

arrayEnemies.splice(i、1)行をコメントアウトすると、正常に機能しますが、配列から削除されません。これ自体は問題ではありませんが、当然、不要なデータを配列に保持するのは好きではありません。これについて何か助けはありますか?

function checkBullet(event:Event) {
    if(stage.contains(mcBullet)) {
        for(var i:int = 0; i < arrayEnemies.length; i++) {
            if(arrayEnemies[i].hitTestPoint(mcBullet.x, mcBullet.y, true)) {
                stage.removeChild(mcBullet);
                this.removeChild(arrayEnemies[i]);
                arrayEnemies.splice(i,1);
                bulletOnStage = false;
            }
        }
        if(mcBullet.x > 800) {
            stage.removeChild(mcBullet);
            bulletOnStage = false;
        }
    }
}


function spawnEnemies(event:TimerEvent) {
    var enemie:MovieClip = new box_mc();
    enemie.name = "mcBox" + event.currentTarget.currentCount;
    enemie.x = 850;
    enemie.y = Math.floor(Math.random()*(1+155)+255);
    addChild(enemie);
    arrayEnemies.push(enemie);
}

function moveEnemies(event:Event) {
    for(var i:int = 0; i < arrayEnemies.length; i++) {
        arrayEnemies[i].x -= 5;
    }
}
4

3 に答える 3

0

あなたの問題は、弾丸が 2 人の敵に当たった場合、ステージから 2 回削除しようとすることです。これは ArgumentError をスローします。

すべての敵に対してテストする必要がある場合 (複数の敵に同じ弾丸が当たる可能性があると仮定)、敵の配列から要素を削除するときに i をデクリメントする必要もあります。

function checkBullet(event:Event) {
    if(stage.contains(mcBullet)) {
        if(mcBullet.x > 800) {
            stage.removeChild(mcBullet);
            bulletOnStage = false;
        }
        for(var i:int = 0; i < arrayEnemies.length; i++) {
            if(arrayEnemies[i].hitTestPoint(mcBullet.x, mcBullet.y, true)) {
                if(stage.contains(mcBullet)){
                    stage.removeChild(mcBullet);
                }
                this.removeChild(arrayEnemies[i]);
                arrayEnemies.splice(i,1);
                bulletOnStage = false;
                i--;
            }
        }
    }
}
于 2012-05-15T14:12:07.367 に答える
0

これは、対話している配列で作業することによって引き起こされます。削除したいものへの参照を保持してから、ループの後にそれを行う必要があります。

于 2012-05-15T12:22:55.230 に答える
0

少し古い質問ですが、ここにたどり着く可能性のある人のために、私の答えも入れたいと思いました。
Neil が言ったように、繰り返し処理している配列 (この場合は arrayEnemies) を編集すると、同時更新の問題が発生する可能性があります。

私が好む解決策は、別の toRemove 配列を使用し、更新後にそれらを削除することです。次に例を示します。

var enemies:Array();
//Lets assume at some point this is populated with Enemy objects

function update():void
{
    var toRemove:Array = new Array();
    //May want to keep and clear an array instead to avoid creating a new one each update

    foreach(var enemy:Enemy in enemies)
    {
        enemy.update();
        if(enemy.markedForRemoval())
            toRemove.push(enemy);
    }

    foreach(var enemy:Enemy in toRemove)
        enemies.splice(enemies.indexOf(enemy), 1);
}
于 2012-07-30T15:02:11.160 に答える