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 :

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 ) ; 
  } ;
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
 
double Circle : Intersect( const Shape& p_shape )
  {
  const type_info& monType = typeid( p_shape ) ;
  if( monType  == typeid( Rectangle ) )
  {
   //ma gestion
   ...
   }   
 
  }
Sauf qu'a chaque nouvelle classe dérivée, je devrais ajouter la gestion de cette nouvelle forme . 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 :

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);
  }
 
}
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.

J'espère avoir été clair

merci