0

AS3 でタワー ディフェンス ゲームに取り組んでいる学生がいて、困った問題を抱えています。彼は、hitTestObject を使用して、movieClip の移動方向を変更しています。ムービークリップには、オブジェクトが向いているさまざまな方向のフレームを含む独自のタイムラインと、オブジェクトの動作のコードを含むリンクされた .as ファイルがあります。

彼が gotoAndStop を呼び出して movieClip の内部フレームを変更すると、削除されたイベントがトリガーされますが、オブジェクトは画面に残り、移動しなくなります。

すべての検索で、オブジェクトの削除に関する回答が見つかりましたが、オブジェクト自体の削除を防止する方法については何も見ていません。

次のコードは、movieClip オブジェクトの .as クラス ファイルの ENTER_FRAME イベントによってトリガーされるループです。

private function eFrame(event:Event):void
    {

        if (_root.isPaused == false)
        {
            //MOVING THE ENEMY
            this.x +=  speed * xDir;
            this.y -=  speed * yDir;
            if (health <= 0)
            {
                _root.currency +=  4;

                this.parent.removeChild(this);
            }
            if (this.x > 770)
            {
                this.parent.removeChild(this);
                _root.health -=  10;
                _root.gotHit = true;
            }
            //checking if touching any invisible markers
            for (var i:int=0; i<_root.upHolder.numChildren; i++)
            {
                //the process is very similar to the main guy's testing with other elements
                var upMarker:DisplayObject = _root.upHolder.getChildAt(i);
                if (hitTestObject(upMarker))
                {
                    yDir = 1;
                    xDir = 0;
                    this.gotoAndStop(3);


                }
            }
            for (i=0; i<_root.downHolder.numChildren; i++)
            {
                //the process is very similar to the main guy's testing with other elements
                var downMarker:DisplayObject = _root.downHolder.getChildAt(i);
                if (hitTestObject(downMarker))
                {
                    yDir = -1;
                    xDir = 0;
                    this.gotoAndStop(7);

                }
            }

            for (i=0; i<_root.rightHolder.numChildren; i++)
            {
                //the process is very similar to the main guy's testing with other elements
                var rightMarker:DisplayObject = _root.rightHolder.getChildAt(i);
                if (hitTestObject(rightMarker))
                {
                    yDir = 0;
                    xDir = 1;
                    this.gotoAndStop(6);
                }
            }
            for (i=0; i<_root.leftHolder.numChildren; i++)
            {
                //the process is very similar to the main guy's testing with other elements
                var leftMarker:DisplayObject = _root.leftHolder.getChildAt(i);
                if (hitTestObject(leftMarker))
                {
                    yDir = 0;
                    xDir = -1;
                    this.gotoAndStop(2);

                }
            }
        }
    }
    private function remove(event:Event):void
    {
        trace("remove");
        removeEventListener(Event.ENTER_FRAME, eFrame);
        _root.enemiesLeft -=  1;

    }
}

gotoAndStop 行が実行されると、movieClip のフレームが変更され、コードは REMOVED イベントによってトリガーされる関数に直接ジャンプします。

このコードによって REMOVED イベントがトリガーされる理由を知っている人はいますか?

ご協力ありがとうございました。

4

2 に答える 2

1

REMOVED イベントは、私が間違っていなければ、それを含む MovieClip または Sprite 内のステージから削除されたものによってトリガーされます。特にアニメーションを含む MovieClip では、たとえば、アニメーションの一部がタイムラインまたはキーフレームで終了する場合など、毎回削除および追加されます。

Event.REMOVED_FROM_STAGE は、コンテナー自体がステージから削除された場合にのみディスパッチされます。多分それはあなたの混乱を引き起こしていますか?あなたのコード例から、あなたがリッスンしているイベントの種類が正確にわかりません。

于 2013-02-21T21:13:28.480 に答える
0

削除リスナーをどこに追加していますか?

これ以上の情報がなければ、アニメーション内のクリップを聞いていて、それがすべてのフレームにあるとは限らないと推測します (または、さらに可能性が高いのは、Flash Pro によってインスタンスが別の同一のものに交換されていることです)。 . これは、キーフレームを追加した順序、月の位置合わせ、および電離層の変動によって発生する可能性があります. すべてのキーフレームを削除してから再作成するだけで簡単に修正できます. そして、フラッシュプロを決して使用しないでください.また。)

于 2013-02-21T18:38:56.517 に答える