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