1

まず、質問をお読みいただき、ありがとうございました。それで、私は小さなフラッシュゲーム(実際にはゲームとは言えません)を作成しました。とにかく、ある時点で、2つのオブジェクトが互いにぶつかるかどうかをチェックしています。要約すると、ここにコードがあります

public function loop(e:Event):void
{
    y += vx;
    if(y > stageRef.stageHeight || y < 0)
        removeSelf();
    if(hitTestObject(target.hit))
    {
        removeSelf();
        stageRef.dispatchEvent(new GameOverEvent(GameOverEvent.DEAD)); // <--
        stageRef.addChild(new SmallImplosion(stageRef, x, y));
    }
}

したがって、それらが衝突すると、1つのオブジェクトがイベントをディスパッチし、コードに問題はなく、機能しますが、この方法で処理するのが良いかどうかを知りたいと思います。stageRefはstageへの参照であり、両方のクラスにあります。

そして、他のクラスがそのイベントをキャッチし、次のような関数をトリガーします。

stageRef.addEventListener(GameOverEvent.DEAD, takeHit, false, 0, true);

問題は、これはそれを処理するための良い方法ですか?前もって感謝します!

4

2 に答える 2

3

オブザーバー パターンを実装する場合、参加する各オブジェクトには明確な役割があります。1 つは、アクションが発生するオブジェクトであるサブジェクトであり、もう 1 つは、サブジェクトのイベントをリッスンするオブザーバーです。Flash では、サブスクライブ メソッドに処理関数を渡すため、任意のオブジェクトをオブザーバーにすることができます。ただし、サブジェクトはIEventDispatcherを実装し、サブジェクトをサブスクライブするために必要なメソッドを提供します。必要なメソッドをすでに実装している標準実装のEventDispatcherもあります (多くの型はそのサブタイプです)。

質問に戻ります。あなたは本質的に、イベントが放送されるステージである第三者を持ち込んでいます。サブジェクトにローカルなイベントをサブジェクト自体にディスパッチするのではなく、グローバル ステージにディスパッチするので、すべてのオブザーバーはサブジェクト自体ではなくステージをリッスンする必要があります。

これは一般的にすべきことではありません。すべてのサブジェクト (IEventDispatcher) は、独自のイベントのみをディスパッチする必要があります。クリックされたボタンからクリック イベントを受け取るのと同じように、それをトリガーするオブジェクトから GameOverEvent を受け取ります。

于 2013-01-04T18:07:15.353 に答える
0

という名前からGameOverEvent、ちょっとした意味が暗示されていると思います。ゲームの最後にやることがたくさんあるので、このようなイベントを聞くのはあなたのステージに適していると思います.

ただし、小規模なシステムを処理するためにこの手法を使用しないでください。たとえば、衝突がプレイヤーにいくらかのダメージしか与えなかった場合 (これがゲームのコンテキストで意味があるかどうかはわかりませんが、ここでロールバックします)、衝突をチェックし、これらの「グランドイベント」を発生させる代わりに、ヘルスを処理するクラスが互いに直接対話します。

于 2013-01-04T18:01:07.457 に答える