少し前にゲームを作り始めて、とても好きなスタイルに出くわしました。コンポーネントベースのアーキテクチャと呼ばれます。チュートリアルは C++ ではなく Objective-C 用ですが、とにかくリンクを含めました: http://www.raywenderlich.com/24878/introduction-to-component-based-architecture-in-games
プロジェクトからプロジェクトへと大量のコードをコピー アンド ペーストしていることに気付いたので、一般的なフレームワーク用のライブラリを作成することにしました。通常、コンポーネントは次のようにエンティティ オブジェクトに含まれます。
#ifndef ENTITY_H
#define ENTITY_H
#include "HealthComponent.h"
#include "MoveComponent.h"
#include "PlayerComponent.h"
#include "RenderComponent.h"
class Entity
{
public:
Entity();
HealthComponent* getHealth();
//Returns a reference to the object's health component
//If there is none, returns a null pointer
MoveComponent* getMove();
//Returns a reference to the object's movement component
//If there is none, returns a null pointer
PlayerComponent* getPlayer();
//Returns a reference to the object's player component
//If there is none, returns a null pointer
RenderComponent* getRender();
//Returns a reference to the object's render component
//If there is none, returns a null pointer
~Entity();
private:
HealthComponent* health;
MoveComponent* move;
PlayerComponent* player;
RenderComponent* render;
};
#endif //ENTITY_H
ライブラリには個々のコンポーネントではなく、一般的なフレームワークが含まれるため、この方法は機能しなくなります。代わりにComponentManager
、コンポーネントを管理するクラスを作成しました。現在、エンティティは次のようになっています。
#ifndef ENTITY_H
#define ENTITY_H
#include "Component.h"
#include "ComponentManager.h"
#include <list>
class Entity
{
public:
Entity();
Entity(ComponentManager const & cmanager);
template <T>
T* getComponent();
//Returns the first component of the specified type
//If there is none, returns NULL
template <T>
T* getComponent(int i);
//Returns the ith component of the specified type
//If the component does not exist, returns NULL
template<T>
int getComponentCount();
//Returns the number of components of the specific type that the
//entity contains
template <T>
int addComponent(T &component);
//Adds a component of the specified type to the class. If a component of the
//class already exists, the component is assigned a number, and the number is returned.
//If no components of the class exist, 0 is returned
~Entity();
private:
int eid;
std::list<ComponentReference> components;
ComponentManager * manager;
};
#endif //ENTITY
これらの関数はまだ定義していないため、実装ファイルは含めませんでした。
ComponentReference
構造体は単に、特定のコンポーネントを見つけるために使用される int と文字列のコレクションです。エンティティは、特定のオブジェクトの内部リストを検索ComponentReference
する のテンプレート化された関数に を渡します。manager
そして、レンガの壁があります。さまざまな未知のタイプの未知の数のオブジェクトを含むリストを作成する方法がわかりません。これらは親Component
クラスから派生していますが、すべて異なる関数とメンバー変数が含まれています。ポインターの配列と型キャストを使用しようとしましたが、3 時間後に、型キャストへの過度の依存は不適切に記述されたコードの指標であると読んだときに断念しました。
STL コンテナーを使用してみましたが、1 つの型しか必要としないため、明らかに機能しません (テンプレート クラスへのポインターを含む C++ std::vector ) 。
私はラッパーについて何かを見ましたが、私が読んだものから、それらは関数でのみ機能するようです: ( c++ store a pointer to a member function of unknown class ) それらが私の問題を解決するために使用できる場合は、それらがどのように機能するかを説明してください (私は今日まで聞いたことがない)
これは私の最初の質問なので、お気軽にフィードバックを残してください。調べたのですが、重複していたらすみません。私は C++ を初めて使用するわけではありませんが、専門家でもありません。また、C++ は大きな言語であるため、説明を求める場合があります。前もって感謝します!