0

これは私のカスタムイベントクラスです:

package{
 import flash.events.Event;

 public class PetEvent extends Event{
      public static const ON_CRASH:String = "onCrash";

      public function PetEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false):void{
           super(type, bubbles, cancelable);
      }

      override public function clone():Event {
           return new PetEvent(type, bubbles, cancelable);
      }
 }
}

これは私のゲーム ハンドラです。リッスンするクラス Surf の新しいインスタンスを作成します。

package {
import flash.display.MovieClip;
import flash.events.Event;

public class GameHandler extends MovieClip {
    public var newGame:Surf;

    public function GameHandler() {
        newGame = new Surf();
        newGame.addEventListener(PetEvent.ON_CRASH, onCrash);
        addChild(newGame);
    }

    public function onCrash(petEvent:PetEvent):void{
        trace("MPAM");
        var gameOver:GameOver = new GameOver(stage.stageWidth, stage.stageHeight);
        addChild(gameOver);

        newGame = null;
    }
}
}

そして、Surf クラスからの関連する行:

public function startSurfing(timerEvent:TimerEvent):void
{
    moveCatandDog();
    for each ( var boat:Boat in armada)
    {
        boat.moveBoat(boatSpeed);
        if ( cat.hitTestObject(boat) || dog.hitTestObject(boat) )
        {
            dispatchEvent( new PetEvent(PetEvent.ON_CRASH) );
            gameTimer.stop();
        }
    }
}

したがって、Surf がクラッシュを検出したら、イベントを GameHandler に送信し、GameHandler が GameOver インスタンスを作成するようにします。

私はすべてを試しましたが、痕跡さえ得られません。私は通常質問をしませんが、これは大学のプロジェクトのためであり、時間が足りません。フィードバックをいただければ幸いです。ありがとう!

4

1 に答える 1

0

問題が解決しました!

ドキュメントクラスをGameHandlerに変更し、ステージのパブリック静的変数を作成する必要がありました。

以前は、キーボードリスナーをステージに設定していたため、ドキュメントクラスとしてSurfを使用していました。

したがって、PetEventとSurfでのディスパッチは正しかった。StackOverflowで見つけた別のソリューションを使用して、以下に示すようにGameHandlerを変更しました。

GameHandlerのコンストラクター内で、ステージの準備ができている(nullではない)場合は、パブリック静的変数STAGEに(init関数を介して)設定します。それ以外の場合は、リスナーを追加し、ステージの準備ができたら、同じことを実行して、リスナー。

package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;

public class GameHandler extends MovieClip {
    public var newGame:Surf;

    public static var STAGE:Stage;

    public function GameHandler() {
        if (stage){
            init();
        } else {
            addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
        }

        newGame = new Surf();
        newGame.addEventListener(PetEvent.ON_CRASH, onCrash);
        addChild(newGame);
    }

    private function init(e:Event=null):void{
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // store stage reference when stage ready  
        STAGE=stage;
    }

    public function onCrash(petEvent:PetEvent):void{
        var gameOver:GameOver = new GameOver(stage.stageWidth, stage.stageHeight);
        addChild(gameOver);

        newGame = null;
    }
}
} 

そして私はGameHandlerをSurfにインポートしました:

import GameHandler;    

だから私はSurfのリスナーをGameHandler.STAGE.addEventListenerに設定することができます(...)

提案してくれてありがとう!

于 2013-02-26T18:07:41.520 に答える