Mise en place d'un Entity System : Problème de template.
Bonjour,
J'ai récemment découvert le principe de l'Entity System et j'éprouve quelques difficultés à le mettre en place / comprendre certains principes.
Explications
Actuellement j'ai réussi à obtenir un code qui me permet de faire cela :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
// Création d'une nouvelle entité.
Entity* entity = game.createEntity();
// Configuration.
entity->addComponent( new TransformableComponent() )
->setPosition( 15, 50 )
->setRotation( 90 )
->addComponent( new PhysicComponent() )
->setMass( 70 )
->addComponent( new SpriteComponent() )
->setTexture( "name.png" )
->addToSystem( new RendererSystem() ); |
Si j'ai bien compris l'Entity System, chaque System possède une liste de composants/component sur lequelle il travaille :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
class Component;
/////////////////////////////////////////////////
/// \brief An abstract system. (Interface)
///
/////////////////////////////////////////////////
class System
{
public:
/////////////////////////////////////////////////
/// \brief Call when process is created.
///
/////////////////////////////////////////////////
virtual bool start() = 0;
/////////////////////////////////////////////////
/// \brief Call when process is updated.
///
/////////////////////////////////////////////////
virtual void update() = 0;
/////////////////////////////////////////////////
/// \brief Call when process is removed.
///
/////////////////////////////////////////////////
virtual void end() = 0;
/////////////////////////////////////////////////
/// \brief Call when process is removed.
///
/////////////////////////////////////////////////
virtual void addComponent( Component* component )
{
elements.push_back( component );
}
protected:
std::vector<Component*> elements;
}; |
(j'ai mis le code dans le .h le temps de tester si ça peur rassurer ^^)
Le problème
Je souhaite ajouter un Component de type T à un System contenant une liste d'éléments de type X.
Concrètement :
J'ai actuellement :
std::vector<Component*> elements;
J'aimerais avoir quelque chose du genre :
std::vector<T*> elements;
Ma classe System est une classe abstraite. Les classes qui héritent de cette classe doivent avoir une liste d'élément de type T donc et non Component. (Afin d'avoir accès aux méthodes de l'objet en question).
Solution possible
j'ai tenté de mettre ma classe "System" en tant que class template, du coup j'ai juste à indiquer le type de classe au moment de l'héritage :
Code:
1 2
|
class Renderer : System<Drawable> |
Le soucis c'est que j'ai un System manager qui contient un conteneur de System et il n'apprecie pas le "std::vector<System> systems".
Auriez-vous une solution à mon problème ? Est ce que je suis dans le bon sujet pour cette question ?
Merci d'avance.
Dono.