更新(要約)
私はかなり冗長な回答を書いたので、ここにすべてを要約します:
- 名前空間は良いです、それが理にかなっているときはいつでも使用してください
- クラスを使用する
inGameIO
とplayerIO
、SRPの違反となる可能性があります。IOを処理する方法とアプリケーションロジックを結合している可能性があります。
- ハンドラークラスによって使用される(または共有される)汎用IOクラスがいくつかあります。これらのハンドラクラスは、生の入力をアプリケーションロジックが意味のある形式に変換します。
- 出力についても同じことが言えます。これはかなり汎用的なクラスで実行できますが、ゲームの状態をハンドラー/マッパーオブジェクトに渡し、内部のゲームの状態を汎用IOクラスが処理できるものに変換します。
あなたはこれを間違った方法で見ていると思います。アプリケーションのコンポーネントの機能でIOを分離していますが、私にとっては、ソースとIOの「タイプ」に基づいてIOクラスを分離する方が理にかなっています。
開始するベース/ジェネリックKeyboardIO
クラスをいくつか用意MouseIO
し、それらをいつどこで必要とするかに基づいて、上記のIOを異なる方法で処理するサブクラスを用意します。
たとえば、テキスト入力はおそらくゲーム内のコントロールとは異なる方法で処理したいものです。各ユースケースに応じて特定のキーを異なる方法でマップしたいことがありますが、そのマッピングはIO自体の一部ではなく、IOの処理方法です。
SRPにこだわり、キーボードIOに使用できるクラスがいくつかあります。状況に応じて、おそらくこれらのクラスとは異なる方法でやり取りしたいと思うでしょうが、唯一の仕事はユーザーが何をしているかを教えてくれることです。
次に、これらのオブジェクトをハンドラオブジェクトに挿入します。ハンドラオブジェクトは、生のIOをアプリケーションロジックで使用できるものにマップします(たとえば、ユーザーが"w"を押すと、ハンドラはそれをにマップしますMOVE_FORWARD
)。
これらのハンドラーは、キャラクターを動かし、それに応じて画面を描画するために使用されます。かなり単純化しすぎていますが、その要点は次のような構造です:
[ IO.Keyboard.InGame ] // generic, if SoC and SRP are strongly adhered to, changing this component should be fairly easy to do
||
==> [ Controls.Keyboard.InGameMapper ]
[ Game.Engine ] <- Controls.Keyboard.InGameMapper
<- IO.Screen
<- ... all sorts of stuff here
InGameMapper.move() //returns MOVE_FORWARD or something
||
==> 1. Game.updateStuff();//do all the things you need to do to move the character in the given direction
2. Game.Screen.SetState(GameState); //translate the game state (inverse handler)
3. IO.Screen.draw();//generate actual output
私たちが今持っているのは、生の形式でキーボードIOを担当するクラスです。このデータをゲームエンジンが実際に意味のあるものに変換する別のクラスは、このデータを使用して関連するすべてのコンポーネントの状態を更新し、最後に別のクラスが画面への出力を処理します。
すべてのクラスには1つの仕事があります。キーボード入力の処理は、処理する入力の意味を知らない/気にする/知る必要があるクラスによって行われます。入力を取得する方法を知っているだけです(バッファ付き、バッファなし、...)。
ハンドラは、これをアプリケーションの残りの内部表現に変換して、この情報を理解します。
ゲームエンジンは、翻訳されたデータを取得し、それを使用して、関連するすべてのコンポーネントに何かが起こっていることを通知します。これらの各コンポーネントは、衝突チェックであろうと、キャラクターアニメーションの変更であろうと、1つのことだけを行います。それは重要ではなく、個々のオブジェクトにまで及びます。
その後、これらのオブジェクトは状態をリレーし、このデータはに渡されますGame.Screen
。これは本質的に逆IOハンドラーです。内部表現を、IO.Screen
コンポーネントが実際の出力を生成するために使用できるものにマッピングします。