トップダウンマルチプレイヤー2Dシューティングゲーム用のゲームエンジンを設計しています。これは、他のトップダウンシューティングゲームで合理的に再利用できるようにしたいものです。現時点では、その中のエンティティシステムのようなものをどのように設計すべきかを考えています。最初に私はこれについて考えました:
EntityManagerというクラスがあります。UpdateというメソッドとDrawという別のメソッドを実装する必要があります。ロジックとレンダリングを分離する理由は、スタンドアロンサーバーを実行している場合、Drawメソッドを省略できるためです。
EntityManagerは、BaseEntityタイプのオブジェクトのリストを所有しています。各エンティティは、EntityModel(エンティティの描画可能な表現)、EntityNetworkInterface、EntityPhysicalBodyなどのコンポーネントのリストを所有しています。
EntityManagerは、EntityRenderManager、EntityNetworkManager、EntityPhysicsManagerなどのコンポーネントマネージャーのリストも所有しています。各コンポーネントマネージャーは、エンティティコンポーネントへの参照を保持します。このコードをエンティティ自身のクラスから移動し、代わりにまとめて実行する理由はさまざまです。たとえば、ゲームには外部の物理ライブラリ、Box2Dを使用しています。Box2Dでは、最初にボディとシェイプをワールド(この場合はEntityPhysicsManagerが所有)に追加し、コリジョンコールバック(システムのエンティティオブジェクト自体にディスパッチされる)を追加します。次に、システム内のすべてをシミュレートする関数を実行します。このような外部コンポーネントマネージャーで行うよりも、これを行うための優れたソリューションを見つけるのは難しいと思います。
エンティティの作成は、次のように行われます。EntityManagerが登録方法のRegisterEntity(entityClass、工場)を実装する方法を、そのクラスのエンティティを作成することを。また、BaseEntity型のオブジェクトを返すメソッドCreateEntity(entityClass)も実装します。
ここで私の問題が起こります:コンポーネントへの参照はどのようにコンポーネントマネージャーに登録されますか?ファクトリー/クロージャーからコンポーネントマネージャーをどのように参照するかわかりません。