[POO] problème de design

problème de design [POO] - Divers - Programmation

Marsh Posté le 02-12-2002 à 21:45:04    

Voilà une question posée sur une mailing list (pas de moi) dont la réponse m'intéresse également (les réponses données sur la mailing list ne me conviennent pas trop et le message se fait un peu vieux) :
 

Citation :

Ami du jour, bonjour.
Ami du soir, bonsoir.
 
Voila, je me décide à poser cette question à laquelle je
n'arrive pas à trouver de réponse qui me convienne, alors
je voudrais avoir l'avis de plusieurs personnes.
 
Ca m'a pris la tête sur le Bomberman et maintenant ca
recommence avec le Mario. Le problème à la base c'est que
lorsqu'on travaille avec des objets, on peut dire que tel
objet fait ca à tel objet. Sans aucun objet, c'est quelque
chose d'impersonnel qui effectue les traitements.
 
J'en arrive au fait. Dans le Mario, il y a différents
éléments dans une arène : des bonhommes, des tortues, des
blocs, etc, etc. Il existe des interactions entre ces
élements. Par exemple, si une tortue est vulnérable et
qu'un bonhomme la touche, elle meurt. On peut déjà se
demander :
1- est ce que c'est le bonhomme qui se rend compte que
la tortue est vulnérable, qu'il la touche et qu'il la
tue ?
2- est ce que c'est la tortue qui se rend compte que le
bonhomme la touche et qui se dit ah tiens il faudrait
que je meurs ?
3- est ce chacun des elements pourrait faire à part
des tests pour determiner chacun ce que eux-memes
doivent faire pour réagir à l'interaction ?
 
Les solutions 1 et 2 obligent :
- à considérer qu'il n'y a qu'un des elements qui
décide des conséquences de l'interaction
- à ce que l'élement qui gère l'interaction sache
beaucoup de choses sur l'autre élement : si c'est
le bonhomme qui gère l'interaction, il faudra, avant
de dire à la tortue "tu es morte", qu'il vérifie
qu'elle est bien vulnérable, et d'autres tests. Bref,
tout ca dépend de la façon dont fonctionne la tortue,
et ce n'est pas au bonhomme de savoir des choses sur
le fonctionnement de la tortue (comme par exemple,
quelles conditions il faut pour qu'elle puisse crever
si on lui saute dessus).
 
Et de plus il n'y a pas vraiment de logique là dedans.
C'est la tortue qui gère elle meme les collisions avec
les bonhommes ? Ben euh oui bien sur, c'est évident.
 
La solution 3 demande qu'on duplique les tests pour
les deux élements, et qu'en fait on sache bien comment
fonctionne l'autre élément.
 
Alors comme aucune des solutions 1,2,3 ne me convenait,
j'ai essayé de trouver mieux. J'ai pensé qu'on pourrait
ramener ce coté "impersonnel" qui permettrait de gérer
les interactions en dehors des deux éléments : ce serait
l'arène qui s'en occuperait. Elle testerait elle-meme
les interactions et dicterait aux éléments concernés de
se comporter comme ci ou comme ca. Ainsi, les classes
des éléments définissent tout ce que l'élément peut faire
(par exemple le bonhomme peut sauter, rapetisser : tout
ca, ce sont des commandes du bonhomme controllé). Et
la classe de l'arène s'occupe de tout ce qui est
interaction, utilisant les commandes disponibles chez
les élements concernés.
 
Ca poserait peut etre juste un petit probleme. Les
élements tombent avec la gravité. Ils doivent donc
effectuer des tests de collisions en avancant pixel par
pixel et donc avec la solution où l'arène gère ca, il
faudrait envoyer à chaque mise à jour d'un élément
l'ensemble des zones où il y a collision. Je ne sais pas
si c'est vraiment génant. Ca pourrait etre une collision
map à passer au constructeur juste une fois, mise à jour
par l'arène quand nécessaire. Mais je n'ai pas essayé
cette solution et j'oublie peut etre (comprendre : sans
doute) des gros inconvénients.
 
Ce que je voudrais c'est savoir :
- ce que vous pensez des solutions proposées
- ce que vous proposeriez vous meme comme solutions
 
Merci de faire du "constructive criticism" comme on le
voit souvent écrit sur flipcode :)
 
fury
fury94@f...
http://www.bomberman.fr.fm/


 
Donc, j'aimerais également avoir votre avis sur la manière la plus élégante de résoudre son problème.
 
Merci ;)


Message édité par _momone_ le 02-12-2002 à 22:21:27
Reply

Marsh Posté le 02-12-2002 à 21:45:04   

Reply

Marsh Posté le 03-12-2002 à 00:30:45    

je crois qu'il part d'une mauvaise conception de ce qu'est la conception objet c'est a dire que parce que c'est objet c'est moins "impersonnel".
 
Bref savoir si c'est la tortue ou le bonhomme qui s'apercoit
qu'elle est morte c'est se preoccuper du sexe des anges.
 
Le principal probleme de la POO c'est d'un de partager
du code et donc de reutiliser les structures
(par heritage), de travailler sur des algos generiques
et de definir par le biais de module une separation
des taches (gestion de la logique, affichage).
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 03-12-2002 à 01:02:19    

D'accord avec Legreg.
 
C'est trop compliqué de toute facon de réagir là dessus...Ca dépend de l'architecture...
 
Pour ce problème, la réponse habituelle, c'est de considérer un système de message, de callback et une gestion centralisée...La tortue determine toute seule s'il elle crève et elle envoie un message à l'arène (ou à l'objet qui la tue si l'implémentation l'oblige) qui s'occupera de détruire l'objet.
L'arène stocke les éléments du décors et les éléments mouvant.
Le bonhomme fait les tests en demandant des infos de visibilité à l'arène, etc.


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 03-12-2002 à 03:03:37    

Pour moi c'est proche de la solution 3.
 
A la base, les collisions de sprites peuvent être détectées par chaque sprite quand il bouge, mais il vaut peut-être mieux que ce soit le jeu qui les détecte à chaque frame, question d'optimisabilité d'algorithme et de synchronisation des mouvements.
Par exemple, inutile de tester les collisions entre tirs.
Je pense que l'arène n'intervient pas ici.
 
-Chaque couple de collision de sprite dipose d'un code propre.
-Cette fonction agit sur les deux intervenants par leur méthodes.
-Chaque type d'objet dispose de méthodes sauter, mourir, ect...

Code :
  1. void Collision(Mario& m, Tortue& t){
  2. if(m.y>t.y){
  3.  t.mourrir();
  4.  m.rebondir();
  5. }else{
  6.  m.mourrir(); //exception lancée ?
  7. }
  8. }


 
Pour la collision avec le terrain, je pense que chaque sprite, au moment du déplacement, demande à l'arène ce qu'il a cogné (peut être rien), et agit en conséquence.
 
 
Après, bien sûr, il faut voir sur quel os on tombe en codant tout ça...
 
 
Ce que je n'ai pas bien compris, c'est comment on gère les séquences de mouvements.
Il me semble que ça ressemble à un automate, je parcourais un tableau de pointeurs de fonctions.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 03-12-2002 à 04:58:33    

pour la premiere partie :
c'est le bonhomme qui fait l'action de tuer la tortue (il interragit sur la tortue)
pour moi une action = un envoie de message
 
donc le bonhomme envoie un msg a la tortue lui disant qu'elle doit mourrir
ca donne un truc du genre
 
Bonhomme bonhomme;
Tortue tortue;
bonhomme.kill(tortue);
 
void Bonhomme::kill(const BaseClass & baseClass) {
    baseClass.setKill(true);
}
 
bien sur Tortue derive de BaseClass (faut trouver un nom plus jolie) tout comme la classe Bonhomme
 
y'a aussi le pattern Observer qui peut etre interessant dans ce cas.

Reply

Marsh Posté le 03-12-2002 à 12:56:23    

Chaque élément collisionnable possède un protocole pour être comparé à un autre, s'il collisionne, il appelle le message de collision de l'autre.
 
C'est bien entendu un double dispaching : tu "dispatche" les collision sur tous les éléments "collisionnable".  
 
pour éviter de te tapper n^2 (n étant le nombre d'objets collisionables dans la scène) tests de collision, tu découpe l'écran en zones et tu compares pas un mec qui est à gauche avec un mec qui est à droite de l'écran (genre octree en 3D).
 
Par contre il te faudra n^2 méthodes (n étant le nombre de classes d'objet collisionable), à cause du double dispatch mais fait une factorisation du code (pas moins de méthode mais code centralisé).
 
Un petit exemple de double dispaching : http://nraynaud.com.free.fr//td3dispatching.html
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed