1

小さなRPGプロジェクトに一種のオブザーバーパターンを使用して中央イベントディスパッチングシステムを作成しようとしていますが、イベントデータを最適に表現する方法についてアドバイスが必要です。

Event_Input_KeyPressedやEvent_Game_ActorMovedなどの静的列挙型で定義されたさまざまなイベントタイプのリスナークラスを登録するEventManagerがあります。イベントをキューに格納し、対応するリスナーにディスパッチします。リスナーには、それぞれメソッドhandleEvent(Event e)などがあります。

各イベントは、イベントタイプなどのデータを保持するイベントタイプのオブジェクトになります。

私の質問は、イベントデータの性質はイベントタイプ間でかなり異なるため、このデータをどのように表現する必要があるかということです。将来どのような種類のイベントを作成したいかはまだわかりませんので、できるだけ柔軟に対応していきたいと思います。たとえば、特定の条件が当てはまる場合(つまり、プレーヤーがアクションキーを押したときに、プレーヤーが特定の場所にいてキーを持っている場合にドアが開く)、イベントが他のイベントをトリガーする可能性があります。XMLまたはスクリプトは良い選択ですか?私が考えることができるもう1つの方法は、ActorEventやMenuEventなどのすべての一般的なイベントに対してカスタムクラスを作成することですが、それは本当に非効率的で柔軟性がないようです。また、Characterなどの一部のオブジェクトは、「w」キーが押されたときなどの非常に特定のイベントのみを知る必要があるため、「h」などの他のキーが押されたときに通知される必要はないと思います。が押されます。特定のイベントタイプを作成することは実行可能ですか、それともより良い方法がありますか?すなわち。Event_Input_KeyPressed_W

ありがとう

4

2 に答える 2

2
  1. Event基本オブジェクトから拡張して、イベントの具体的な実装を作成します。まず、オブジェクトの配布が簡単になります。つまり、キュー内にある場合はinstanceof、オブジェクトの処理方法を決定するためにaを実行するだけで済みます。
  2. イベントリスナーコードは、はるかに単純になり、より厳密に制御されます。マウスイベントがキーイベントに渡される可能性はありません。また、リスナーレベルでイベントオブジェクトをテストしてキャストする必要はありません。
  3. 特定のイベントの特定の状態についてのみ通知を受け取りたい「フィルター処理された」イベントリスナーを作成できなかった理由がわかりません。実際、それは素晴らしいアイデアだと思います。
  4. 私はおそらく、ある種のプラグ可能なディスパッチングメカニズムを考案するでしょう。つまり、新しいイベントタイプを追加するときに、キューを更新する必要はなく、新しいディスパッチャを登録するだけで済みます。達成したいことに応じて、キューはイベントをディスパッチャーに渡します(ディスパッチャーがリスナーのリストを取得するための何らかの手段を提供します)。ディスパッチャは、イベントの処理方法を知っているかどうかを判断します。次に、ディスパッチャは必要なリスナーにイベントをディスパッチし(そして、達成したいことに応じて)、イベントがディスパッチされたかどうかを示す結果を返します。

それはMHOです

于 2012-07-26T22:55:14.357 に答える
2
  • さまざまなイベントタイプの構造が異なると言うように、イベントごとに具体的なクラスを作成することをお勧めします。キーごとにクラスを作成する必要はありません。しかし、一般的にはキーボードイベント
  • あなたは、キャラクターは特定のキーについてのみ通知されるべきだと言います。キャラクターに通知し、そのオブジェクトに無関係のキーを無視させるオーバーヘッドはわかりませんが、これがクラス間で一般的なパターンである場合、たとえば、特別なキーのセットに反応する可能性のある10の異なるクラスがある場合は便利ですコードを繰り返さず、イベントとリスナーの間にディスパッチャーレイヤーを実装します。1種類のdisptacherは、キーのリストを受け取り、それに基づいてイベントをフィルタリングするKeyFilterDispatcherです。別の種類のディスパッチャは、複数のイベントが特定の順序で考慮された場合にのみリスナーを妨害するseqDispatcherです。私はMadProrammerが言ったプラグ可能なdisptacherのアイデアが好きです。また、ディスパッチャのパイプも作成することをお勧めします。
于 2012-07-27T02:16:53.643 に答える