2

敵のブロックを削除するのに問題があります。現時点では、全員を攻撃しても問題ありませんが、回避すると次のエラーメッセージが表示されます

ArgumentError: エラー #2025: 指定された DisplayObject は呼び出し元の子でなければなりません。flash.display::DisplayObjectContainer/removeChild() で EnergyJump/onTick() で flash.utils::Timer/flash.utils:Timer::_timerDispatch() で flash.utils::Timer/flash.utils:Timer::ティック()

ここに私が持っている私のコードがあります:

public function onTick( timerEvent:TimerEvent ):void 
        {
            //if ranrom number is than than i
            if ( Math.random() < i )
            {
                //place block on stage at location X=550, Y=330
                var randomX:Number = Math.random() * 550;
                var newBlock:Blocks = new Blocks( 550, 335 );
                army.push( newBlock );
                addChild( newBlock );
                //increase speed of spawn
                i = i + 0.0001;
            }

            //move blocks in correct direction
            for each ( var block:Blocks in army ) 
            {
                block.move();
                //if block is hit then remove health and remove child object
                    if ( avatar.hitTestObject( block ) ) 
                    {

                        hp.checkHP(20);
                        army.splice(army.indexOf(block), 1);
                        removeChild( block );

                    }
            }
        }

誰かが私を助けてくれますか、正直に言うとスライスが何であるか、またはそれを使用する方法が本当にわかりません...

4

3 に答える 3

1

Array.splice()のドキュメントはこちらをご覧ください。

最初の引数は、アイテム自体ではなく、削除するアイテムのインデックス(0、1、2など)である必要があります。blockFlashは整数として読み取ろうとしていますが、デフォルトは0であるため、ヒットしたブロックを削除する代わりに、リストの最初のブロックを削除するだけです。代わりにこれを試してください:

army.splice(army.indexOf(block), 1);

ゲームの終了時にリスト内の残りのブロックをクリアするコードがあると思いますが、間違ったブロックがリストから削除されているため、実際にヒットしたブロックを削除しようとしています。

于 2013-01-17T19:38:55.337 に答える
0

removeChild()の呼び出しの前に行われたこれらのオブジェクトのそれぞれに対応するaddChild()の呼び出しがあることを確認しますか?現時点では、何が起こっているのかを実際に伝えるのに十分なコードが表示されていませんが、その間にaddChild()が呼び出されることなく、同じオブジェクトでremoveChild()が複数回呼び出されていないことも確認してください。 。

于 2013-01-17T19:14:14.340 に答える
0

わかりました、私はあなたのファイルをざっと見ました。この質問のトピックから少し外れていますが、私が見つけた問題をリストします。一般的には、Flash が不満を言っている部分を調べて、本当に正しい変数で作業していることを確認する必要があります (たとえば、 と書く場合は、 Flash がどの部分を見よblockうとしているのかを確認するようにしてください。block物事を変更するときは順序が重要です。)

間違ったアイテムを誤って削除したり、null のものを使用しようとしたりするのは簡単です。そのため、各行を確認し、その時点で各変数が実際に何であるかを考えてください (変数もトレースしてみてください)。

  • ではavatarEnterFrame、画面の端からはみ出たブロックをチェックしていますが、 のfor eachようなループを追加していないonTickため、そこを使用するとblock、Flash はpublic var block:Blocks;のブロックではなくメインを見ていますarmy
  • 0 の項目ではなく、チェックしているオブジェクトを削除するように、前と同じ方法でonPowerTickyour を調整する必要があります。splicepowerups
  • 削除しようとする直前に null に設定しているため、Flash は何を削除すればよいかわかりませんrestartGamegameOverScreen他のすべての作業が完了するまで、null に設定したままにしておいてください。

ゲームオーバー画面の問題については別の回答を投稿して、適切な場所に配置します.

于 2013-01-18T00:19:44.740 に答える