0

シナリオ:Mainでは、クラスBulletのインスタンスが生成されてステージに追加され、配列bltarrayに、クラスEnemyのインスタンスが生成されてステージに追加され、nmearrayに追加されます。これは正常に機能します。

問題は散発的に発生します。つまり、機能し、すぐに機能しなくなります。機能しない場合、出力エラーでスパムが送信され、スコア表示が絶えず上昇します。これは、弾丸と敵の同じインスタンスであることに注意してください。

Bullet instance98 hit Enemy instance45
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at Main/everyframe()
Bullet instance98 hit Enemy instance45
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at Main/everyframe()

私が理解していないのは、

私が使用しているコードは以下のとおりです(これもメインにあります)

for (var j=0;j<bltarray.length;j++){
    if (bltarray[j].hitTestObject(nmearray[i])){
        trace("Bullet "+bltarray[j].name+" hit Enemy "+nmearray[i].name);
            score += 1;
            scorevalue.text = score.toString();
            // Remove dead objects from stage
            stage.removeChild(nmearray[i]);
            stage.removeChild(bltarray[j]);
            // Remove reference to objects from array
            nmearray.splice(i,1);
            bltarray.splice(j,1);
            trace('nmearray length:'+nmearray.length)
    }
}

弾丸クラスと敵クラスの両方に、他のイベントリスナーを削除するための独自のREMOVED_FROM_STAGEイベントリスナーがあります。

私がそれにいる間、このエラーも時々ポップアップします。

TypeError: Error #2007: Parameter hitTestObject must be non-null.
at flash.display::DisplayObject/_hitTest()
at flash.display::DisplayObject/hitTestObject()
at Main/everyframe()
4

1 に答える 1

0

forループ中にスプライシングするときに一般的な問題が発生する可能性があるようです。基本的に、配列から要素をスプライスすると、次の要素がすぐにその場所にプッシュされ、forループが実際にすべての要素をチェックするわけではありません。

forループを逆forループに切り替えて、何が起こるかを確認してください。

for (var j=bltarray.length-1;j >= 0;j--){
//do stuff
}

編集: forループを長さ-1に修正しました

于 2012-04-03T22:31:34.327 に答える