0

私は簡単なゲームを作成していて、「レーザー」オブジェクト(スペースシュムップ)から敵をヒットチェックするために、敵でいっぱいのベクターを持っています。すべてのレーザーはベクターをループし、ヒットサークルを遮っているかどうかをチェックします。問題は、1つのレーザーが敵を破壊したときに、残りのレーザーも同じベクトルをチェックしようとしますが、敵はすでにスプライスされており、ベクトルのサイズが変更されているため、範囲外になります。

for each (var enemy:Enemy in enemies){
                var distanceX = this.x - enemy.x;
                var distanceY = this.y - enemy.y;
                var distance = Math.sqrt( (distanceX*distanceX) + (distanceY*distanceY) );

                if (distance <= enemy.hitRadius) {
                    enemy.removeEnemy();
                    enemies.splice(enemies.indexOf(enemy),enemies.indexOf(enemy));
                }
}

削除するベクター内の個々の要素のインデックスを収集し、すべてのレーザーオブジェクトのチェックが終了したときにのみそれらを削除するにはどうすればよいですか?

編集:念のため、EnemyクラスからのremoveEnemy()関数を次に示します。

public function removeEnemy(){
            removeEventListener(Event.ENTER_FRAME, move);
            parent.removeChild(this);
            trace("removed Enemy", enemies.indexOf(this));
        }

編集編集:removeEnemy()関数で「親」へのnull参照ポインターエラーも発生します...ただし、たまにしか発生しません。この2つの問題の一方を修正すれば、もう一方も修正されると思いますが、よくわかりません。

4

1 に答える 1

0

それを私が直した!問題は、実際には「splice()」メソッドの使用方法にありました。2番目のパラメーターは、スプライシングを停止する場所の終了インデックスではなく、スプライシングされる要素の数であることがわかります。したがって、要素0をスプライスしようとしたときは何もスプライスしていませんでした。また、要素3をスプライスしようとしたときは、4と5もスプライスしていました。APIを正しく読み取らず、これで数時間。コメントしてくれたすべての人に感謝します-あなたたちは私が問題だと思ったものを除外するのを手伝ってくれました。

于 2012-11-02T21:38:49.647 に答える