0

AS3を使ってゲームを作っています。クラスGameEngineのすべての子である3 つのクラス(宇宙船、UFO、およびスコアボード)があります。

Scoreboardに eventListeners を配置してから、 SpaceshipUFOから dispatchEvents を送信して、 scoreboardインスタンスを更新したいと考えています。

SpaceshipUFOはScoreboardの親でも子でもないため、 bubbling=true パラメータを dispatchEvent に追加しても何も起こりません。

これを行わずにスコアボードに * dispatchEvent *をリッスンさせるにはどうすればよいですか:

GameEngine.scoreboard.dispatchEvent(new Event("shipWasHit", true));

このようにするのはばかげているようです。なぜ私はdispatchEventを使用するのでしょうか?関数を直接呼び出さないのはなぜですか? また、他のクラスに同じ dispatchEvent をリッスンさせたい場合はどうすればよいでしょうか?

お知らせ下さい。

4

4 に答える 4

2

オブザーバー パターンを確認してください。ここに良いリンクがあります:

http://www.swinburne.edu.au/design/tutorials/P-flash/T-The-Observer-Design-Pattern-in-Actionscript-3/ID-145/

于 2011-03-03T03:07:12.113 に答える
1

伝播が中断されないキャプチャ フェーズまたはバブル フェーズのいずれかを使用するイベントはすべてステージを通過するため、指定したクラス内にステージのリスナーを追加するだけで済みます。

コード例:

public function Receiver()
{
    addEventListener(Event.ADDED_TO_STAGE, added, false, 0, true);
}

private function added(evt:Event):void
{
    stage.addEventListener(Event.shipWasHit, shipHit, false, 0, true);
}

private function shipHit(evt:Event):void
{
    //code
    evt.stopPropagation();
}

さて、ここでいくつか注意事項があります。まず、ステージを参照するには、このクラスをインスタンス化してステージに追加する必要があります。それ以外の場合は、ステージでパラメーターとして渡す必要があり、場合によっては null を返す可能性があります。最後に、イベントがディスパッチされる前にこれをインスタンス化する必要がありますが、これは現在見ているコードの問題ではないようです。

于 2011-03-03T03:28:46.700 に答える
0

私はこのソリューションを使用します(すでにSOに投稿されています)

于 2011-03-03T09:34:40.610 に答える
0

宇宙船と UFO は次のようにします。

dispatchEvent(new Event("shipWasHit"));

また、スコアボードは、これらのイベントをリッスンする宇宙船と UFO を知る必要があります。

someShip.addEventListener("shipWasHit", onShipHit);

thatUFO.addEventListener("shipWasHit", onUFOHit);

これらのリスナーを追加するのに適した場所は、それらの宇宙船と UFO を作成するクラス、またはある時点でリッスンする船と UFO を指定する場合はスコアボード自体です。

于 2011-03-03T14:44:29.567 に答える