後でアクションが完了するのを待つコマンドまたはイベントの処理


7

2つのイベントがあるとします:Action1とAction2。Action1を受け取ったときに、次にAction2が回転するときに使用する任意のデータを保存する必要があります。最適には、Action1は通常コマンドですが、他のイベントにすることもできます。考え方は同じです。

これを実装する現在の方法は、状態を格納し、特定の状態が存在する場合にAction2が呼び出されたときに単純にチェックすることです。これは明らかに少し厄介であり、多くの冗長なコードにつながります。これが私がこれをどのように行っているかの例を、疑似コードの形式で(そして明らかにかなり細かく分解して)示します。

void onAction1(event) {
    Player = event.getPlayer()
    Player.addState("my_action_to_do")
}

void onAction2(event) {
    Player = event.getPlayer()

    if not Player.hasState("my_action_to_do") {
        return
    }

    // Do something
}

他の多くのアクションでこれを行うと、それはやや醜くなり、それを改善するために私にできることがあるかどうか知りたいと思いました。

データを渡す必要がないようなものを考えていましたが、これも正しい方向ではありませんか?

void onAction1(event) {
   Player = event.getPlayer()
   Player.onAction2(new Runnable() {

       public void run() {
           // Do something
       }

   })
}

それをさらに進めたい場合は、単にこれを行うことはできませんか?

void onPlayerEnter(event) { // When they join the server
    Player = event.getPlayer()
    Player.onAction1(new Runnable() {

       public void run() {

           // Now wait for action 2
           Player.onAction2(new Runnable() {
               // Do something
           })

       }

    }, true) // TRUE would be to repeat the event,
             // not remove it after it is called.
}

どんな入力でも素晴らしいでしょう。


4
アクションリスト(およびコマンドキュー)パターンを検索します。ただし、一般的には、だらしのないままになると予想されます。ゲームのロジックは通常、きちんとしたパターンに押し込められません。
Sean Middleditch、2012年

回答:


1

最初の例が最も単純だと思います。何かをするなら、中央のActionManagerを用意します。アクションは、後で取得する他のアクションのためにデータをポストすることができます。「メッセージ」がエンティティに配信されないことを除いて、私はほとんどイベントシステムのようになります。それらは、アクションがメッセージを受け取るのを待つだけです。

これは、Action1をAction2から分離するのに役立ちます。これにより、Action3をAction2に接続したい場合も同様にできます。Action2は1または3を認識していないか、気にしていません。気になるのは、Action2Messageを探すことだけです。


0

ActionListener / Handler / Managerがどのように見えるかを知らずに解決策を思い付くのは難しい

私がそれをする方法(私はc#開発者ですが、Javaでも同じことが可能だと思います):

状態を登録する代わりに

Player.addState("my_action_to_do")

私はAction2イベントのActionListenersのスタックを用意します。それに、Action2が呼び出された場合に呼び出されるハンドラーをvoid onAction1()イベントが追加します。

(私はJavaで試しますが、実行できない可能性があります):

Stack<ActionListener> onAction2Events = new ...;

void onAction1(event) {
    Player = event.getPlayer();
    onAction2Events.add(new ActionListener() {
      public void actionPerformed(ActionEvent e) { 
          // this code will be called if onAction2 is invoked
      }
    });
}

void onAction2(event) {
    Player = event.getPlayer()

    InvokeEvent(onAction2Events); // calls all ActionListeners / states that ware added

    // ...
}

void InvokeEvent(Stack<ActionListener> listenerStack) {

    while(listenerStack not empty)
    {
        listenerStack.pop().actionPerformed(...);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.