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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.