私は最初のゲームエンジンを開発しており、壁に当たっています。現在、私はいくつかのシステムマネージャクラス(graphisManager、PhysicsManagerなど)内のコンポーネントオブジェクトへのポインタを保持するコンポーネントポインタのベクトルを持つEntity基本クラスを持っています。ここでは(主な問題に焦点を当てるストリップダウン)私の現在のエンティティヘッダは次のとおりです。ゲームエンジンでコンポーネントを最適に管理するにはどうすればよいですか?
Entity.h
class Component;
namespace BlazeGameWorld
{
class Entity
{
public:
BlazeFramework::Math::Vector2D position;
protected:
Vector<Component*> components;
static BlazeGraphics::GraphicsManager graphicsManager;
static BlazePhysics::PhysicsManager physicsManager;
static BlazeInput::InputManager inputManager;
//....other managers
private:
///////////////////////////////////////////////////////////////////////
public:
Entity();
~Entity();
virtual bool Initialize();
virtual bool Shutdown();
virtual void Update() = 0;
void AddComponent(Component* p_component);
//Part of the broadcast messaging system for components to be able
//to talk to one another in a decoupled way.
void SendMessage(uint messageID);
protected:
private:
};
}
あなたが見ることができるように、アイデアが実際にポインタを管理します静的するSystemManagerクラスを持つことですヒープ上のコンポーネントここでは潜在的なPhysicsManagerクラスのラフヘッダーはある(そしてそれは他のマネージャークラスについても同様です):
PhysicsManager.h
class PhysicsComponent;
namespace BlazePhysics
{
class PhysicsManager
{
public:
protected:
int numPhysicsComponents;
private:
Vector<PhysicsComponent*> physicsComponents;
/////////////////////////////////////////////////////////////
public:
PhysicsManager();
~PhysicsManager();
bool Initialize();
bool Shutdown();
void Update();
template <typename PhysicsComponentType>
PhysicsComponentType* CreatePhysicsComponent();
private:
};
//template definitions
template <typename PhysicsComponentType>
PhysicsComponentType* PhysicsManager::CreatePhysicsComponent()
{
PhysicsComponentType* physicsComponent = new PhysicsComponentType
physicsComponents.push_back(physicsComponent);
return physicsComponents.at(numPhysicsComponents++);
}
}
だから私はPhysicsMangerベクトル内のすべての異なるphysicsComponentのポインタを格納することができます(ポインタへCollisionComponents、PositionComponentsなど)。問題は、特定の物理コンポーネント固有のメソッドを呼びたい場合、コンパイルできないということです。例えば、(PhysicsManagerの更新ループで)collisionComponentのCheckCollision()メソッドを更新するには、forループの中で言うことができません。physicsComponents.at(i).CheckCollision
コンパイラはCollisionComponentをコンパイル時に認識しないためです。多分配列の中のコンポーネントの型を推定し、それがCollisionComponentと一致すればCheckCollisionメソッドを呼び出す方法がありますか?または、これは一種のように思われるので、これを実装する方が良いですか?
ここでコンポーネントベースのエンジンを見てうれしいですが、私はあなたと同様の構造の私の最初のゲームエンジンに取り組んでいます。しかし、私はゲームエンジンのリファレンスを各システムに渡し、リファレンスを使用して他のシステムにアクセスできるようにしました。私はそれが良いかどうかわからないが、少なくともそれは働いている。もっと良い解決策を見たいと思っています。XD –
あなたのことを聞いてうれしいです。私は、さまざまなコンポーネントタイプの配列の配列を実装するいくつかのソリューションを検討しています。私がこのような何かを実装する方法を見つけ出すことができれば、私はここで解決策を投稿するかもしれません。 – Jason