ゲームを作成するとき、多くの場合、すべてのエンティティが継承する次のゲームオブジェクトを作成します。
public class GameObject{
abstract void Update(...);
abstract void Draw(...);
}
したがって、更新ループでは、すべてのゲームオブジェクトを反復処理して状態を変更する機会を与え、次に次の描画ループですべてのゲームオブジェクトを再度反復処理して、自分自身を描画する機会を与えます。
これは、単純なフォワードレンダラーを備えた単純なゲームではかなりうまく機能しますが、モデル、複数のテクスチャ、およびゲームオブジェクト間の密結合を作成するすべての最悪の脂肪描画メソッドを格納する必要があるいくつかの巨大なゲームオブジェクトにつながることがよくあります。現在のレンダリング戦略とレンダリング関連のクラス。
レンダリング戦略をフォワードから据え置きに変更する場合、多くのゲームオブジェクトを更新する必要があります。そして、私が作成するゲームオブジェクトは、可能な限り再利用できません。もちろん、継承や構成はコードの重複との闘いに役立ち、実装の変更が少し簡単になりますが、それでもまだ足りないと感じています。
おそらく、より良い方法は、GameObjectクラスからDrawメソッドを完全に削除して、Rendererクラスを作成することです。GameObjectには、それを表現するモデルやモデルにペイントするテクスチャなど、ビジュアルに関するデータを含める必要がありますが、これを行う方法はレンダラーに任されます。ただし、レンダリングには境界線のケースが多いことが多いため、これによりGameObjectからレンダラーへの密結合が削除されますが、レンダラーはすべてのゲームオブジェクトについてすべて知っている必要があります。固く結ばれた。これはかなりの数の良い習慣に違反します。多分データ指向設計がうまくいくかもしれません。ゲームオブジェクトは確かにデータですが、レンダラーはこれによってどのように駆動されますか?よく分かりません。
だから私は途方に暮れていて、良い解決策を考えることができません。私はMVCの原則を使用しようとしましたが、以前はゲームでそれを使用する方法についていくつかのアイデアがありましたが、最近は思ったほど適切ではないようです。皆さんがこの問題にどのように取り組んでいるのか知りたいです。
とにかく要約してみましょう。次の設計目標をどのように達成できるかに興味があります。
- ゲームオブジェクトにレンダリングロジックがない
- ゲームオブジェクトとレンダリングエンジン間の疎結合
- 知っているすべてのレンダラーはありません
- レンダーエンジン間のランタイム切り替えが望ましい
理想的なプロジェクトセットアップは、互いに参照する必要のない別個の「ゲームロジック」とレンダリングロジックプロジェクトです。
John CarmackがTwitterで、実行時にレンダーエンジンを入れ替えることができ、両方のレンダラー(ソフトウェアレンダラーとハードウェアアクセラレーテッドレンダラー)を使用するようにシステムに指示することもできる柔軟性のあるシステムを持っていると私が言ったとき、この思考トレインはすべて始まりました。同時に、彼は違いを調べることができます。これまでにプログラムしたシステムは、それほど柔軟ではありません