[C] fonctions imbriquées, je m'y perds [résolu]

fonctions imbriquées, je m'y perds [résolu] [C] - C - Programmation

Marsh Posté le 03-05-2012 à 18:07:21    

Bonjour,
 
Je vais essayer de faire simple pour me faire comprendre, voici le header :

Code :
  1. void jouer(SDL_Surface* ecran);
  2. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction);
  3. int mangerObjet(int *premiereCase, int *secondeCase);


 
Dans la fonction jouer()  j'ai déclaré une variable :

Code :
  1. int score=0;


 
Maintenant la fonction jouer() appelle la fonction deplacerJoueur() qui à son tour appelle la fonction  mangerObjet()
Et c'est d'ici que je souhaite effectuer des manipulations sur la variable "score"
Comment dois-je procéder ? avec des return ?

Message cité 1 fois
Message édité par caps lock le 03-05-2012 à 23:15:19
Reply

Marsh Posté le 03-05-2012 à 18:07:21   

Reply

Marsh Posté le 03-05-2012 à 19:15:30    

il faut que tu passes un pointeur sur les variables que tu comptes manipuler à ta fonction qui effectue la manipulation.
 
En général, tu vas avoir plusieurs choses qui vont déterminer l'état complet de ton jeu. Il est d'usage de regrouper ces choses au sein d'une structure d'état du jeu et de transmettre cette structure d'état aux fonctions intéressées.


---------------
last.fm
Reply

Marsh Posté le 03-05-2012 à 19:45:31    

C'est exactement ce que j'essaie de faire sur le topic : http://forum.hardware.fr/forum2.ph [...] nojs=0#bas
 

Reply

Marsh Posté le 03-05-2012 à 22:53:28    

caps lock a écrit :

Bonjour,
 
Je vais essayer de faire simple pour me faire comprendre, voici le header :

Code :
  1. void jouer(SDL_Surface* ecran);
  2. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction);
  3. int mangerObjet(int *premiereCase, int *secondeCase);


 
Dans la fonction jouer()  j'ai déclaré une variable :

Code :
  1. int score=0;


 
Maintenant la fonction jouer() appelle la fonction deplacerJoueur() qui à son tour appelle la fonction  mangerObjet()
Et c'est d'ici que je souhaite effectuer des manipulations sur la variable "score"
Comment dois-je procéder ? avec des return ?


 
De façon classique, cela se fera comme ça
 

Code :
  1. void jouer(SDL_Surface* ecran)
  2. {
  3.      ...
  4.      int score=0;
  5.      ...
  6.      deplacerJoueur(..., ..., ..., &score);
  7. }
  8. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction, int *score)
  9. {
  10.     ...
  11.     ...
  12.     mangerObjet(..., ..., ..., score);
  13. }
  14. int mangerObjet(int *premiereCase, int *secondeCase, int *score)
  15. {
  16.     ...
  17.     ...
  18.     *score=nouvelle_valeur;
  19.     ...
  20. }


 
Ca c'est la méthode basique. Le principal inconvénient c'est que si tu multiplies les variables, tu vas multiplier les paramètres et les pointeurs et au final tu ne t'y retrouveras plus.
 
Une solution plus réfléchie est de commencer par créer une structure destinée à gérer tous les éléments de ton jeu. Ca pourrait donc être un truc de ce style
 

Code :
  1. typedef struct {
  2.     ...
  3.     ...
  4.     int score;
  5.     ...
  6. } t_joueur;


 
Puis tu t'en sers comme ça
 

Code :
  1. void jouer(SDL_Surface* ecran)
  2. {
  3.      ...
  4.      t_joueur joueur;
  5.      joueur.score=0;
  6.      ...
  7.      deplacerJoueur(..., ..., ..., &joueur);
  8. }
  9. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction, t_joueur *joueur)
  10. {
  11.     ...
  12.     ...
  13.     mangerObjet(..., ..., ..., joueur);
  14. }
  15. int mangerObjet(int *premiereCase, int *secondeCase, t_joueur *joueur)
  16. {
  17.     ...
  18.     ...
  19.     joueur->score=nouvelle_valeur;
  20.     ...
  21. }


 
Ainsi, si t'as besoin d'un nouvel élément te suffit de l'intégrer dans ta structure et t'en servir là où t'en as besoin....

Reply

Marsh Posté le 03-05-2012 à 23:14:51    

Excellent ça a fonctionné du premier coup. Merci :jap:

Reply

Sujets relatifs:

Leave a Replay

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