|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Alexis Étudiant Inscription : avril 2012 Messages : 8 ![]() |
Bonjour à tous,
Me voila en plein apprentissage du C et de la SDL. Je suis actuellement en train de coder un petit Mario Sokoban afin de pratiquer. Mais je rencontre un petit problème que je n'arrive pas du tout à résoudre depuis deux jours déjà. Le problème peut vous paraître tout simple, mais sachez que je suis un jeune débutant. ^^ Pour vous présenter mon problème, partons du fait que j'ai seulement deux fichiers : « jeu.c » et son équivalent en header, « jeu.h » (que je trouve inutile de présenter dans ce post). Voila donc mon fichier "jeu.c". Je vous l'accorde, c'est un peu le bazar mais je pense qu'apprendre à coder proprement vient avec l’expérience. Code :
Mais cela coince lorsque mon personnage pousse la caisse et que celle ci est bloquée par un mur derrière. Ma caisse est stoppée net par le mur, mais mon personnage, si je continue à appuyer sur les flèches directionnelles, rentre dans la caisse. Or, je veux que lorsque la caisse est en contact avec un mur, il soit stoppé lui aussi mais par la caisse. Quelques screens pour bien comprendre le problème Ci-dessus le personnage est bloqué dès la caisse et ne peut plus pousser dans la direction du mur (cas que je voudrais obtenir mais que j'ai dans les cas où orientation == HAUT et orientation == DROITE). Ci-dessus, le personnage n'est pas bloqué par la caisse et lui rentre dedans, il ne peut pas pousser dans la direction du mur aussi. (Cas que j'ai lorsque orientation == BAS et orientation == GAUCHE). Voila le bout de code que je soupçonne de planter: Code :
Je voudrais ainsi obtenir le résultat des cas quand orientation == DROITE et orientation == HAUT pour les deux autres orientations, c'est à dire quand orientation == BAS et orientation == GAUCHE. Merci d'avance pour votre aide. |
||||
|
|
00
|
|
|
#2 |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Bonjour,
Pour un débutant, c'est un projet déjà remarquablement abouti. Bravo ! Tu as déjà commencé à factoriser les opérations que tu auras à répéter fréquemment, en les déportant dans des fonctions qui leur sont propres. C'est bien. Cela dit, tes fonctions ne sont pour le moment que des procédures impératives, dans le sens où elles sont toutes de types void. En s'arrangeant pour qu'elles renvoient un booléen permettant d'indiquer si l'opération s'est bien passée ou pas, tu pourrais plus facilement mettre en place des séquences d'opérations, voire même t'arranger pour les appeler récursivement : en l'occurence, ce serait la fonction déplace_joueur() qui appelerait elle-même une fonction deplace_caisse() le cas échéant, et qui renverrait toute de suite false sans déplacer le joueur si deplace_caisse() renvoie false elle aussi. L'avantage, c'est que tu passerais tes coordonnées x et y en argument de fonction, et que tu pourrais les rappeler autant de fois que tu le veux en faisant les modifications (« ± 1 ») sur tes paramètres, donc sans avoir à modifier les variables initiales. |
|
|
10
|
|
|
#3 | ||||||
|
Invité de passage
![]() Alexis Étudiant Inscription : avril 2012 Messages : 8 ![]() |
Yes merci de l'aide
Code :
En effet voila le code que j'avais fait au début en suivant ta méthode entièrement: Code :
Code :
Après je vois pas tellement l'utilité d'un return a part pour tester si la fonction s'est bien exécutée, comme tu nous le dis plus haut. D'ailleurs je vais modifier mon code source afin de vérifier si certaines de mes fonctions se sont bien passées. Sinon j'aurais une autre question, voila mon problème résolut, mais maintenant y'a un truc qui me gène... C'est de n'avoir pas compris pourquoi mon code en début de sujet ne marchait pas Cordialement Menudelux. |
||||||
|
|
00
|
|
|
#4 | ||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Pourquoi renvoyer le résultat de « collision » via un pointeur plutôt que par le retour de la fonction elle-même ? Si tu la fais renvoyer un booléen, tu peux écrire ensuite :
Code :
Code :
enum element { vide=0, mur=1, caisse, objectif, caisse_ok, joueur }; Code :
enum direction { HAUT=1, DROITE, BAS, GAUCHE }; À ce stade, dans le corps de ta fonction, tu commences par définir deux variables « dx » et « dy » en fonction de la direction. Ces variables pouvant toutes deux valoir +1, 0 ou -1. L'avantage est qu'il s'agit de variables locales. Elles ne modifieront donc pas les coordonnées originales. De là, tu poses plusieurs postulats :
Et pour honorer ce dernier point, rien n'empêche ta fonction « déplacer » de se rappeler elle-même en cours de procédure pour déplacer la caisse, puis finir de déplacer le joueur si ça s'est bien passé. Après il faudra faire attention à différentes choses, comme le fait de ne pas remplacer une case « objectif » par du vide en passant dessus, et autres petites formalités. Il faudrait que je prenne le temps de le lire en détail pour voir à quelle ligne ça coince mais, en même temps, il est un peu tard et c'est à toi de le faire : le déboguage fait partie intégrante du métier du développeur, et le travail d'enquête peut être très stimulant en soi. |
||
|
|
10
|
|
|
#5 | |
|
Invité de passage
![]() Alexis Étudiant Inscription : avril 2012 Messages : 8 ![]() |
Désolé pour mon absence je n'avais plus de pc sous la main.
J'ai décidé de tout refaire afin de faire un code performant et à la fois propre. Je suis donc entrain de suivre tes conseils, pardon si je vais te faire répéter mais je n'arrive pas du tout à comprendre comment tu me conseilles de former ma fonction déplacer. Citation:
Merci d'avance. |
|
|
|
00
|
|
|
#6 | |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Citation:
En retour, cette fonction renvoie 1 si l'objet a bien été déplacé et 0 si elle n'a pas pu le faire. Dans les faits, la fonction vérifie si l'objet aux coordonnées indiquées est soit le joueur, soit une caisse (bien placée ou pas). Si ce n'est pas le cas, on sort en renvoyant 0 tout de suite car tout autre objet (les murs, donc) est inamovible. Si c'est une caisse, il faut que sa destination soit vide ou soit un des points de stockage à atteindre ; Si c'est le joueur, il faut que sa destination soit vide, un point de stockage ou soit une caisse que l'on peut déplacer. Et pour vérifier ce dernier point le cas échéant, il suffit de rappeler récursivement « déplacer() » alors qu'on est encore dedans, en passant les coordonnées de la caisse. Si cet appel-là renvoie 0, la caisse ne peut être déplacée et le joueur non plus, par conséquent. On ressort donc en renvoyant 0 également, en cascade. Mais si l'appel a renvoyé 1, alors non seulement la caisse peut être déplacée mais elle vient de l'être ! Il n'y plus qu'à déplacer le joueur qui est désormais face au vide et à renvoyer 1 également, en cascade, pour signifier à la fonction principale que le déplacement des deux éléments s'est bien passé. |
|
|
|
10
|
|
|
#7 |
|
Invité de passage
![]() Alexis Étudiant Inscription : avril 2012 Messages : 8 ![]() |
Merci bien pour l'aide Obsidian.
Je pense avoir compris, je pars donc direct recoder mon mario sokoban en entier |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com