2017-08-11 7 views
0

私はシステム機能から返された新しいコンポーネントを簡単に交換できる単純な2d戦闘ゲーム用のコンポーネントシステムを実装する方法を見つけようとしています。アイデアは、私はコンポーネントのセット上で動作するシステム機能の束を持っている:私の2d C++ゲームのためのコンポーネントシステムの実装

例:

PosisiontComponent MovementSystem(PositionComponent pos, VelocityComponent vel) 
{ 
    //..Make entity move 
    return pos; 
} 

ここで重要なのは、私はコンポーネントの新しいコピーを返すようにしたいですし、変更しないで私のシステム機能の中の直接の状態(システムの理解とテストのために)。理想的には、この新しい更新位置コンポーネントは、何らかの並べ替えのmyFighter.Insert()メンバ関数を通じて、基本的にエンティティクラスのように動作する私のファイターに挿入することができます。これまでは、std::map<int key, Component* comp>を使用して、キーがマップ内の特定のコンポーネントをルックアップするために使用できる1つのコンポーネントタイプのみに接続された一意のIDであることを考慮してコンポーネントを格納することを考えています。私はに実行している問題は、私は非常に私は(現在は単なる変換によるコンパイルエラーを取得GetComponent()関数を使用して個々のコンポーネントを返す方法がわからないです

class Fighter 
{ 
public: 
    void Insert(Component* comp); 
    Component* Get(); 

    std::map<int, Component*> componentMap; 
} 

Fighter::Fighter(std::string const imageFilePath, float startPositionX, float startPositionY) : 
    sprite(imageFilePath, 200, 200) 
{ 
    componentMap[0] = new PositionComponent(glm::vec2{ 0.0f, 0.0f }); 
    componentMap[1] = new VelocityComponent(); 
} 

void Fighter::Insert(Component* component) 
{ 
    componentMap.erase(compID); 
    componentMap[compID)] = component; 
} 

Component* GetComponent() 
{ 
    return componentMap[id]; 
} 

:のような戦闘機のクラスは何かを見えるかもしれませんタイプの問題)を現在の実装と比較します。

私の質問(複数可)している:私の現在の実装では、実行可能なソリューション

1)ですか? GetComponent()関数から特定のコンポーネントを抽出する方法はありますか?そうでない場合は、私のFighterクラス内の個々のコンポーネントを簡単に交換するより良い方法はありますか?

答えて

0

各エンティティはタイプごとに1つのコンポーネントしか持たないと仮定すると、テンプレートを使用できます。

template<typename T> 
T* getComponent() { 
    for (auto &component : components) 
    { 
     T* derivedComponent = dynamic_cast<T*>(component); 
     if (derivedComponent) 
     { 
      return derivedComponent; 
     } 
    } 

    return NULL; 
} 

これを使用すると簡単になり、idを共有する必要はありません。また、地図の順序は、ゲームを中断することなく変更することができます。これは、実行時にコンポーネントを追加および削除するときに発生します。

Fighter* f; 
PosisiontComponent* positionComponent = f->getComponent<PosisiontComponent>(); 

これは私がこれまで使ってきたアプローチであり、とてもうまく機能しています。しかし、これらのコンテナの生ポインタに対してスマートポインタを使用することをお勧めします。

+0

提案していただきありがとうございます! getcompコールの頻度を考えると、dynamic_castエフェクトのパフォーマンスはそれほどですか? – Jason

+0

@Jasonはい、そうですが、ダイナミックキャストは多くのことですが速いです。パフォーマンスに影響します。 – skypjack

関連する問題