Listener設計

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やま

Listener設計

#1

投稿記事 by やま » 14年前

プログラミング技術の向上を目的に共同作業で2D格闘ゲームを作ろうとしています
言語はC++、DXライブラリを使います。まだプログラミング経験も浅い身分です。
C++から学習を始めたため、ほとんどそれらについてしか知りません

ユーザー入力を処理するクラスに関する話として、Javaに詳しい知人からリスナーという概念を聞きました。
基底リスナークラスから派生したクラスは皆キー入力を受け取って処理を行える関数を共通に持ち、
逆に入力クラス(名づけるならたとえばclass InputGamePad)はリスナーたちのリストを保持し、
登録されているインスタンスの共通関数を呼び出して処理をするものだそうです
ようは入力情報を聞き手リストたちに教えてあげる仕組みだと思っています(?

自分がその前に作っていた入力クラスは毎フレーム呼び出されて入力状態を調べ、
過去数秒の入力状態をリストに保存することでコマンド入力の成功を調べたりできるようにしてました。
bool CheckCommand(What Command?)のような関数を持たせておき、
キャラクタークラスは入力クラスを内部に保持して、どのコマンドが成功したか調べられます。
これは機能するしないでいえばしていたんですが、知人曰くあまり良くないよとのことでした。

それでリスナー使ってみて!というアドバイスをもらったのですが(あとイベント?とかも)
概念は分かっても書き方が頭に浮かびません。ていうか私の頭が知人についていってません
入力クラスは聞き手にいつ、どんな情報をどのような形態で引数に入れてリスナーに教えてあげるのか
また、リスナー設計自体についても分かりやすい説明があればいいなと思います。
C++のリスナーについて情報があまりないので質問させていただきます。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: Listener設計

#2

投稿記事 by beatle » 14年前

リスナーはJavaがクラスしか扱えないためにリスナークラスというものをInputGamePadクラスに登録して使います.
やま さんが書きました:ようは入力情報を聞き手リストたちに教えてあげる仕組みだと思っています(?
正しいです.

で,C++の場合は関数(グローバル関数,メンバ関数)も扱えますから,クラスなんていう大きな仕組みを用いず,関数をInputGamePadに登録して,入力が有ったらその関数を呼び出してもらうようにもできます.
まあ,Javaと同じようにクラスを登録するようにしてもいいですけど.

その知人さんの話についていくためには,C++のオブジェクト指向的な部分,つまりクラスや継承などを学習する必要があります.
リスナー設計はJava docを読んだら分かりやすいんじゃないでしょうか.どんな情報を引数に渡しているだとか.

リスナーの考え方はつまるところイベント駆動型ということなのですが,ゲームの場合は自分から入力状態を確認するポーリング型の方が向いている気がします.ですから,やまさんが行なっていた「毎フレーム入力状態を調べる」ということは正解だと思います.知人さんは,その部分にツッコミを入れたのか,「過去数秒の入力状態をリストに保存する」の部分にツッコミを入れたのか,よく分かりませんが.

やま

Re: Listener設計

#3

投稿記事 by やま » 14年前

解答ありがとうございました

そのポーリング型でも問題無いとのことで多少安心しました。
ゲームを全てイベント駆動型で作るとなるとけっこう参った気持ちでした。
関数ポインタだけもう少し勉強しておこうと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る