私は C++ で効率的な「エンティティ システム」を作成しようとしています。多くの情報を得るために、インターネットで多くのブログ/記事/ドキュメントを読みましたが、またいくつか質問があります。
2 つの興味深いテーマを見つけました。
- データ駆動型システム
- エンティティ コンポーネント システム
私にとって、2 つのシステムは非常によく似ています。
したがって、Adam Smith によるこの例を見つけました: https://stackoverflow.com/a/2021868
次のような柔軟なシステムが必要です。
// Abstract class
class Component
{
// data here
}
// exemple
class Car : public Component
{
// Data here
}
// Entity with components
class Entity
{
std::vector<Component*> components;
}
したがって、エンティティに次のコンポーネントがある場合: 車、変換、スプライト、 コンポーネント配列にはデータ駆動型システムのような線形データが含まれていましたか?
今、私はシステムを持っています:
class System
{
virtual void init();
virtual void clear();
virtual void update();
std::unordered_map< const char*, Entity*> entities;
}
class RendererSystem : public System
{
// Methods's definition (init, clear, …).
void update()
{
for( entity, … )
{
Sprite* s = entity->getComponent('sprite');
...
}
}
}
- 仮想関数が悪いと読んだことがありますが、その場合は悪いですか?
- get コンポーネントには static_cast が必要です。それは悪いことですか?
- データ駆動型システムでは、どこにでもポインターがありました。「元の」変数はどこにありますか?
- 私はこれを正しくしましたか?
このすべてのポイントは、私の心の中で「ぼやけて」見えます。