[C/C++] Gestion des collisions dans un bomberman

Le côté programmation du développement d'un jeu vidéo.

Gestion des collisions dans un bomberman

Messagepar FaFa » 03 Fév 2009, 21:51

Bonsoir,

Je suis en train de développer un petit bomberman en C++/SDL et j'ai une question au niveau de la conception.

Voilà, j'ai une classe CItem qui correspond à la classe mère de n'importe quel élément de l'arène de jeu. Les classes CBomber, CFloor, CWall qui correspondent respectivement à un personnage, de l'herbe, ou un mur (les caisses ne sont pas encore inclues pour le moment) hérite de la classe CItem.
Ma classe arène (CArena) se charge d'instancier chacun de ses éléments. Plusieurs tableau y sont inclus (tableaux de bomber, de wall, de floors, ... etc).

Je voudrais prendre en compte la collision entre le personnage et les murs (ainsi que les autres éléments de l'arène considérer comme "dur"). Je ne sais pas où implémenter la méthode de vérification (directement dans la classe arène, ou dans la classe personnage), qui vérifie si l'élément sur lequel le bomber souhaite se déplacer est un élément "dur" ou non. Dans le 2ème cas, je suis obliger de passer un tableau des éléments "durs" de l'arène en référence.

Pour moi, cela dépend seulement de la classe CBomber et non de la classe CArena, seulement je n'en suis pas sûr, quels sont vos avis sur la question ?

J'espère avoir été le plus clair possible et merci d'avance pour vos réponses.

FaFa
Avatar de l’utilisateur
FaFa
Hello World, I'm new !
 
Messages: 51
Inscription: 29 Mai 2007, 09:38
Localisation: Montréal

Messagepar tof » 04 Fév 2009, 11:12

Pour ma part j'ai toujours effectue la verification des collisions directement dans ma classe World/Arena, et le comportement en cas de detection dans les classes de personnage.

En effet comme tu la precisais, il n'y a que la classe Arena qui a la connaissance de tous les objets presents dans le niveau, donc cela me parait plus naturel de lui demander de faire le travail que de passer une reference a ce tableau a chacun des objets du jeu (car il n'y a pas que les personnages qui vont reagir aux collisions, mais aussi les caisses et les items).

Ceci dit, c'est aussi une habitude que j'ai prise en utilisant pygame, vu que les fonctions de detection des collisions disponible sont directement a la racine de cette bibliotheque plutot que des methodes des classes Sprite.
tof
 
Messages: 1763
Inscription: 11 Avr 2005, 12:00

Messagepar Keph » 04 Fév 2009, 13:51

En tout cas, pour savoir si un CItem est "dur" ou non, tu peux définir une méthode CItem::is_dur() que tu redéfinis dans chacune des classes qui en héritent.

Ex : CWall::is_dur(){ return true; } et CEmpty::is_dur(){ return false; }. Comme ca, peu importe le type de la classe, il suffit de faire CArena::get_item_at(x,y).is_dur() et tu peux agir en conséquence.

Ensuite, comme le dis tof, c'est au personnage de connaître sa réaction face à une collision.
Avatar de l’utilisateur
Keph
Hello World, I'm new !
 
Messages: 214
Inscription: 26 Avr 2005, 22:17
Localisation: Angers

Messagepar FaFa » 04 Fév 2009, 19:07

Je suis assez d'accord avec vous, je vais adaptez cette solution.

Merci Tof et Keph
Avatar de l’utilisateur
FaFa
Hello World, I'm new !
 
Messages: 51
Inscription: 29 Mai 2007, 09:38
Localisation: Montréal

Messagepar Andrion » 03 Mar 2009, 12:22

J'utiliserai plutôt une fonction

void CEmpty::move(Vector& movement) ;

qui mettrai le movement à x=0;y=0;z=0 en cas de mur frontal.

Dans le cas ou le mur ne serai pas parfaitement perpendiculaire au mouvement, tu peut calculer la trajectoire en projetant le vecteur de movement sur le mur, ce qui te donnera un mouvement réduit qui consiste à longer le mur.
Avatar de l’utilisateur
Andrion
Hello World, I'm new !
 
Messages: 68
Inscription: 27 Oct 2005, 15:59
Localisation: Marseille


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Yahoo [Bot] et 20 invités

cron