BOMBERMAN EN C++ ET SDL, MOTEUR TERMINÉ MAIS A AMÉLIORER, SANS BUGS CONNUS.

ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010 - 26 oct. 2008 à 03:56
xristamati Messages postés 1 Date d'inscription jeudi 20 janvier 2011 Statut Membre Dernière intervention 21 janvier 2011 - 21 janv. 2011 à 18:37
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/48298-bomberman-en-c-et-sdl-moteur-termine-mais-a-ameliorer-sans-bugs-connus

xristamati Messages postés 1 Date d'inscription jeudi 20 janvier 2011 Statut Membre Dernière intervention 21 janvier 2011
21 janv. 2011 à 18:37
hello to all! this programm seems very interesting! I would like to know if anyone of you managed to open the file frame.cpp because I try to read it and unfortunatelly I see only one line of code :( I would appreciate it if someone could send me the code of this file.

Thanks! Good work
popoldenouvion Messages postés 7 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 13 mai 2013
20 juil. 2010 à 14:27
J'ai réussi à différencier les images selon que les personnages (joueurs, monstres, ...)vont en haut en bas, à droite ou à gauche.
J'aimerai ajouter une animation selon chaque direction et ma question est ou serait-il le plus judicieux de placer les lignes de programmes pour ces animations. animation du style de marche des personnages selon la direction et animation des yeux ou autres .... à voir selon la faisabilité et animation par exemple des bombes dont la mêche allumé diminue avec le temps ; les flammes semblent bouger et changer de couleur ....
Avec des exemples concrets comme celui-ci on arrive plus facilement à évoluer et j'en profite pour remercier une nouvelle fois l'auteur de cet exemple qui m'a beaucoup servi.
Cordialement.
JPM
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
28 juin 2010 à 21:47
C'est pas vraiment une question de temps mais plus d'idéologie dans ce cas là, je ne mâche pas le travail, programmer c'est beaucoup de réflexion, si vous voulez évoluer il faudra le faire par vous même après si vous avez des questions à propos de quelque chose que vous n'avez pas compris sur mon code je suis toujours là ;)
popoldenouvion Messages postés 7 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 13 mai 2013
28 juin 2010 à 17:32
Je ne dispose pas de skype ; j'ai essaye de suivre vos conseils mais n'y arrive pas. J'ai réussi à faire l'animation pour les monstre en mettant des if dans le Framerender et cela fonctionne très bien pour les monstres mais alors je n'ai plus l'image de boby .
Si cela est possible et si votre temps le permet, pourriez-vous me communiquer ce qu'il faudrait que je tape concrétement pour réaliser ce que vous conseillez et me dire aussi à quel endroit le saisir. D'avance je vous remercie ; mon adresse mail est : popoldenouvion@wanadoo.fr
Si votre temps ne le permet pas je comprendrais très bien. Je vous remercie encore pour votre coopération et vous renouvelle mes félicitations.
popoldenouvion Messages postés 7 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 13 mai 2013
27 juin 2010 à 16:19
Bonjour et Merci pour une réponse si rapide ; j'avoue que je pensais que je n'aurai peut-être pas deréponse vu la date des commentaires précédents mais je tiens à vous remercier très sincèrement et je vais étudier vos conseils et essayer de les mettre en pratique car je suis novice dans ce domaine et j'avoue qu'il y des lignes que j'ai du mal à analyser.
Dans le dossier de votre programme il y avait un lien (adresse) pour vous contacter ; est-elle encore valable et pourrais-je éventuellemnt vous contacter pour d'autres renseignements ?

Bien cordialement.

JPM
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
27 juin 2010 à 06:12
C'était prévu mais je n'avais pas d'images comme je voulais pour le faire enfaite alors j'avais arrêter de coder cette partie par manque de temps mais il n'y a quasi plus rien à faire enfaite :P
Bref niveau code, tu dois juste ajouter une donnée membre de type long à la classe PLAYER, que tu affectera avec la direction du personnage, puis tu devras utiliser cette donnée membre pour choisir la bonne image à afficher.
Donc dans PLAYER::Framemove quand tu reçois l'action m_bActions[UP] tu affecte ta donnée membre à UP, pareil pour DOWN, LEFT et RIGHT. Puis dans Player::FrameRender au moment où tu dois afficher ton perso avec la fonction SDL_BlitSurface tu lui donne comme image m_pCharacters[m_lDirection] avec m_lDirection comme étant ta donnée membre.
Une autre façon de faire serait d'avoir directement un pointeur sur un SDL_Surface indiquant l'image courante à afficher, que tu changeras uniquement quand l'utilisateur change de direction et dans la méthode FrameRender tu n'aura qu'à utiliser ce pointeur qui sera toujours censé être valide.
Dans les deux cas si tu implémente ça dans la classe PLAYER ça marchera pour le joueur humain et l'ia.

A autre chose qui ne devrait pas poser problème mais qui est quand même une erreur (de copier coller :P), fichier user.cpp, ligne 99 à 102 je définie la couleur clé pour chaque image (haut, bas ...) sauf qu'à chaque fois je passe en paramètre le format de l'image UP alors que je devrais passer le format de l'image correspondante : pour UP le format de l'image correspondant à UP, pour DOWN le format de l'image correspondant à DOWN...
Le même problème est présent dans ai.cpp ...

Désolé mais à l'époque je ne maitrisais pas très bien les fonctions virtuelles, c'est pour ça qu'il y a un peu de copier coller par-ci par-là.

Bonne chance pour la suite ;)
popoldenouvion Messages postés 7 Date d'inscription mardi 12 mars 2013 Statut Membre Dernière intervention 13 mai 2013
26 juin 2010 à 10:20
Oui vraiment un beau travail que je salue.
Une petite remarque concernant le déplacement des monstres dont seule une image apparait alors que dans le programme a bien distingué les positions up down left et right. Et si l'on met 4 images différentes selon la position le programme n'affiche que l'image correspondant à la ligne pDownImageFile ; y a t il quelque chose que je ne vois pas ?

Si un réponse est possible je suis preneur car j'aimerai que selon que le monstre se déplace vers le haut, le bas, à gauche ou à droite une image différente corresponde à chaque sens et puis idem pour le personnage.
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
28 oct. 2008 à 17:25
Pas de problème ^^
Sinon un autre petit bug, au niveau du déplacement qui arrive très rarement mais pas aléatoirement.
Si on pose une bombe et que l'on se déplace vers un carreau adjacent, en mettant le centre de l'image dans le carreau adjacent mais avec une partie de l'image encore sur la bombe et si on reessaye de se déplacer sur la bombe, le joueur sera automatiquement replacé sur le carreau adjacent étant donné que la bombe est considérée comme un objet où le joueur n'est pas censé aller dessus.
Enfin bon c'est pas se qu'on pourrait appeler un bug majeur, rien qui empeche de jouer normalement m'enfin je le dis quand même ^^
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
28 oct. 2008 à 17:19
ca m'apprendra à lire la description ^^ autant pour moi !
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 1
28 oct. 2008 à 17:17
Salut ,

ton projet a l'air très intéressant , je me plongerais dans le code plus tard ...
Mais pour l'instant , serais tu mettre l'exécutable dans le zip
(renomme le en .ex pour qu'il passe )
que je puisse testé la bête (j'ai pas envie de réinstaller une nième * SDL et FMOD)

Merci
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
28 oct. 2008 à 02:03
Je crois avoir trouver à quoi c'est dû. Le jeu est en temps réel, donc les mouvements sont basés sur le temps et un "dt" est calculé (dt = temps écoulé entre 2 frames), hors quand on déplace la fenêtre, la frame n'est pas mise a jour et le dt devient très grand ce qui fait que quand on réaffiche une frame, le monstre se "téléporte". On peut mettre en évidence ce bug en posant une bombe et en tenant (pas obligé de déplacé) la barre système avec la souris, si vous attendez suffisamment longtemps et que vous relâchez la bombe va exploser instantanément alors que le jeu était pourtant bien en "pause". Enfaite quand on déplace la fenêtre, elle se lance dans une boucle de message informant sur son statut de déplacement et demandant une réactualisation de l'image la ou la fenêtre est en train d'être déplacé (même si vous la déplacer pas le fait de tenir la barre système en cliquant dessus est compté comme si vous déplaciez la fenêtre). Cette réactualisation est indépendante de la SDL et du programme qui sont eux a l'arrêt, c'est pourquoi l'image est figée. Par contre la variable contenant le temps qui est géré par l'OS est extérieur au programme et toujours actualisée (enfin elle l'est a la demande). Se qui fait que quand le programme redémarre on lui demande "quelle heure est-il" (par l'intermediaire de la fonction get_ticks() de sdl qui appelle la fonction de l'OS gerant le temps) et on fait la différence avec l'heure à laquelle la dernière frame a été affiché, c'est à dire juste avant que l'on déplace la fenêtre. Ce qui créé une différence énorme et déplace les monstres super vite, et fais exploser les bombes instantanément, en cherchant bien on peut trouver d'autre bugs similaires. Mais on peut tous les résoudre d'un coup en résolvant le problème du "dt" qui doit se remettre a jour correctement (par exemple en faisant iTime=SDL_GetTicks(); et en recalculant le "dt") juste après que la fenêtre est été déplacé (la SDL doit nous permettre d'avoir cette info) ou bien simplement limité les dt trop grands, exemple si dt>100 then dt=10; m'enfin là c'est un peu bricolé mais utile pour les pc susceptibles de ramer, ce qui est aussi une cause de "dt" trop grands.

C'est bien vu pour le bug je n'avais pas pensé à faire ce genre de test, merci ;)
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
27 oct. 2008 à 22:50
Ca sent le bon gros boulot bien rigoureux ça.
Cahier des charges, power-point de présentation, dragrammes, etc, je dis chapeau.
Vraiment pas mal.
Un défaut par contre, quant à l'exécution du jeu. Quand on joue en mode "windowed" et qu'on déplace la fenêtre, il se peut que certaines marmottes se barrent de leur endroit (je suppose que lors du MOVE de la fenêtre, le calcul des trajets des marmottes continue de se faire, sans évaluer les conditions (cases passables ou pas)).
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
27 oct. 2008 à 04:06
N'hésitez pas à laisser des commentaires (wesh laissez des comms xD) si vous comprenez pas bien quelque chose ou bien simplement pour me dire si ce code vous a aider ou bien pour me dire ce que vous améliorerais non pas au niveau ajout de fonctionnalités au jeu mais plutôt dans le genre, optimisation du moteur ... (etc), si vous trouvez quelque chose d'incohérent qui prend plein de ressources pour rien par exemple ou bien que vous connaissez une meilleur méthode pour faire ceci ou cela, enfin des feedbacks quoi :P
ionstorm356 Messages postés 38 Date d'inscription vendredi 6 août 2004 Statut Membre Dernière intervention 28 juin 2010
26 oct. 2008 à 03:56
Je tient juste à préciser que dans le dossier resource\support vous trouverez la doc de la source (dossier docs) ! ainsi que le diagramme des modules, ce qui peut être très pratique pour comprendre le programme. J'ai aussi laissé le diagramme de Gantt et la présentation qui n'est pas vraiment ce que j'aurai fais si j'avais eu le choix mais il fallait s'aligner sur ce que l'on me demandé de faire.
Le diagramme de Gantt n'est pas tout a fais rigoureux car normalement une tâche ne devrait s'effectuer qu'en une fois à se qu'il parait ^^