ゲームアーキテクチャ/設計の質問-グローバルインスタンスを回避しながら効率的なエンジンを構築する(C ++ゲーム)
ゲームアーキテクチャについて質問がありました。異なるコンポーネントを相互に通信させる最良の方法は何ですか? この質問がすでに何百万回も聞かれている場合、私は本当に謝罪しますが、私が探している正確な種類の情報を持つものを見つけることができません。 私はゲームをゼロから構築しようとして(重要な場合はC ++)、インスピレーションのためのいくつかのオープンソースゲームソフトウェア(Super Maryo Chronicles、OpenTTDなど)を観察しました。これらのゲームデザインの多くは、(レンダリングキュー、エンティティマネージャー、ビデオマネージャーなどのように)世界中でグローバルインスタンスやシングルトンを使用していることに気付きます。グローバルインスタンスとシングルトンを避け、可能な限り疎結合のエンジンを構築しようとしていますが、効果的な設計の経験不足に起因するいくつかの障害に直面しています。(このプロジェクトの動機の一部はこれに取り組むことです:)) GameCore他のプロジェクトで見られるグローバルインスタンスに類似したメンバーを持つメインオブジェクトを1つ持つデザインを構築しました(つまり、入力マネージャー、ビデオマネージャー、GameStageすべてのエンティティとゲームプレイを制御するオブジェクトがあります)現在読み込まれているステージなど)。問題は、すべてがGameCoreオブジェクトに集中しているため、異なるコンポーネントが互いに通信する簡単な方法がないことです。 たとえば、スーパーマリョークロニクルを見ると、ゲームのコンポーネントが別のコンポーネントと通信する必要がある場合(つまり、敵オブジェクトがレンダーキューに追加されてレンダーステージで描画される場合)は、常にグローバルインスタンス。 私は、ゲームオブジェクトに関連情報をオブジェクトに渡しGameCoreて、GameCoreオブジェクトがその情報を必要とするシステムの他のコンポーネントに渡すことができるようにする必要があります(つまり、上記の状況では、各敵オブジェクトレンダリング情報をGameStageオブジェクトに返します。オブジェクトはすべてを収集し、に返します。レンダリング情報は、レンダリングのGameCoreためにビデオマネージャーに渡されます)。これは、本当に恐ろしいデザインのように感じられ、これに対する解決策を考えていました。可能なデザインに関する私の考え: グローバルインスタンス(Super Maryo Chronicles、OpenTTDなどの設計) GameCoreオブジェクトを、すべてのオブジェクトが通信する仲介者として機能させる(上記の現在の設計) コンポーネントと通信する必要がある他のすべてのコンポーネントへのポインターを指定します(つまり、上記のMaryoの例では、敵のクラスは通信する必要があるビデオオブジェクトへのポインターを持ちます) ゲームをサブシステムに分割する-たとえば、サブシステム内のGameCoreオブジェクト間の通信を処理するマネージャーオブジェクトをオブジェクトに含める (別のオプション? ....) 上記のオプション4が最適なソリューションであると思いますが、デザインに問題があります。おそらく、グローバルを使用するデザインを見てきました。現在の設計に存在する問題と同じ問題を、各サブシステムで複製しているように感じます。たとえば、上記のGameStageオブジェクトはこれをやや試みたGameCoreものですが、オブジェクトはまだプロセスに関与しています。 誰でもここで設計のアドバイスを提供できますか? ありがとう!