Bonjour,
J'ai déjà effectué des recherches notamment sur le forum mais je n'arrive pas concrètement à voir la solution :
Il s'agit peut être d'un problème classique mais je cherche à gérer la collision entre différents objets d'un petit jeu, sachant que les collisions ne sont pas identiques entre les différents objets :
Pour faire simple, voila comment je pourrai gérer le collision pour chaque classe dérivée :
et pour chaque fonction GestionCollision, il faudrait que je gère les cas possibles. :
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 class Shape { public : virtual double GestionCollision( const Shape& p_shape ) = 0 ; } ; class Circle : public Shape { public : virtual double GestionCollision( const Shape& p_shape ) ; } ; class Rectangle : public Shape { public : virtual double GestionCollision( const Shape& p_shape ) ; } ;
Sauf qu'a chaque nouvelle classe dérivée, je devrais ajouter la gestion de cette nouvelle forme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 double Circle : Intersect( const Shape& p_shape ) { const type_info& monType = typeid( p_shape ) ; if( monType == typeid( Rectangle ) ) { //ma gestion ... } }. Ce n'est pas extensible et facilement maintenable.
J'ai lu sur un lien récent du forum que les solutions à mon problème sont le double|multi Dispatch/le pattern observateur/RTTI.
Seulement dans mon code appelant, je gère une liste de Shape et chaque itération je viens tester les collisions de cette manière :
Mon problème est que J'ai du mal à voir par exemple comment utiliser le pattern observateur ou RTTI et l'intégrer dans mon code. Je voudrais que cela reste générique et pouvoir ainsi ajouter de nouvelles classes sans toucher à ma classe de base et aux classes dérivées.
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 BOOL ClasseAppelante::CheckShapeCollision(Shape* p_TestShape){ vector<Shape*>::iterator iShape; for (iShape= m_vShape.begin(); iShape!= m_vShape.end(); iShape++) { if (p_TestShape == (*iShape)) continue; // Test la collision if (p_TestShape->TestCollision(*iShape)) //gestion collision return GestionCollision((*iShape), p_TestShape); } }
J'espère avoir été clair
merci
Partager