私はSFMLとOpenGLを使って小さなゲームを作って初心者のC++スキルを練習しています。プログラミングの部分は大部分がうまくいっていますが、実際のコード/クラスの設計については質問があります。C++/OOPゲームデザイン
私は1つのクラスMainLoopを持っています。このクラスには、ゲームループが含まれていて、イベント、グラフィックス、コマンド、ゲーム、UIの各クラスのインスタンスが1つあります。私は当初、それらのすべてを単一のクラス(異なる.cppファイルで区切られた関数)にすることを望んでいましたが、それはOOP/C++にとって間違ったアプローチであると言われました。しかし、私はそれらを分離して(カプセル化、モジュール性、デバッグ)良い側を見ることができますが、私はあまりにも多くの悪いものに遭遇しているようです。ユーザーがUIボタンを押した場合の例を挙げてみましょう。
まず、MainLoopは、SFMLのウィンドウクラスからイベントを取得します。 MainLoopはそれを自分のイベントクラスに送ります。イベントクラスはイベントを解釈し、それをUIクラスに送信して、ボタンにヒットしたかどうかを確認します。 trueの場合、UIクラスはbuttonコマンドを解釈するCommandクラスにUIクラスを送信します。そして最後に、コマンドクラスはそれをGameクラスまたはそれ以外の場所に送ります。
私にはとても重いようですが、少なくとも私が今やっているやり方では、多くの前方宣言が必要でした(そして、私がトンで終わったことを知る前に循環依存性の)。私はそれがパフォーマンスのためにもうまくいくとは思わない。
とにかく、ここに私は行方不明のトリックですか?どのようにこれらのクラスを結び付けるべきですか、どのようにコミュニケーションをとるべきですか?たとえば、EventクラスからUIクラスにコマンドを転送する方法はありますか?私は本当に前方宣言を持っていなければならず、あらゆるものを包み込んでいくべきでしょうか、そうではありませんか? MainLoopクラスをすべて実行して、代わりに宣言を必要としない整数/浮動小数点/文字を使用してリターンを転送する必要がありますか?私はちょっとここで紛失している。
私はそのようなアプローチを考慮していませんでしたが、それは有益です。これまでは、イベント/ UI /コマンドで実装するシンプルなグローバル・アクションの「GameState」を使用していましたが、表示する内容と入力に反応する方法を決定しています。私。 GameState == MainMenuの場合は、これらのUIオブジェクトを描画します(メインのゲームビューでこれらを描画するなど)。あなたのアプローチは、きれいなクリーナーであり、より有用かもしれません。しかし、あなたはそれらをまったく破壊しないのですか?あなたはそれらをアクティブ/非アクティブにするだけですか? – user1870725
これは主にあなたの特定の問題に依存します。ビューが重い場合はそれらを破壊する必要があります。そうでなければ、それらを無効にすることができます。もちろん、前者のアプローチでは、ビューの永続的な状態(内部オブジェクトである可能性がある)が必要であるため、必要なときにリカバリできるようにする必要があります。 – Jack
私はあなたが示唆したアプローチも使用しましたが、私は、全体の複雑さが特定のしきい値を超えて成長したと説明したものに似た何かに切り替える必要があると感じたので、コードはリパクタリングする価値があったほど大変でした。 – Jack