[C] SDL avec combo BlitSurface() + Flip()

SDL avec combo BlitSurface() + Flip() [C] - C - Programmation

Marsh Posté le 01-05-2012 à 10:50:48    

En me basant sur le tutoriel de Mateo21 sur le siteduzero.com qui consiste à la réalisation d'un jeu en C, je ne comprends pas dans ce code:
 

Code :
  1. while (continuer)
  2.     {
  3.         SDL_WaitEvent(&event);
  4.         switch(event.type)
  5.         {
  6.         case SDL_QUIT:
  7.         continuer = 0;
  8.         break;
  9.         case SDL_KEYDOWN:
  10.         switch(event.key.keysym.sym)
  11.         {
  12.             case SDLK_ESCAPE:
  13.                 continuer = 0;
  14.                 break;
  15.             case SDLK_UP:
  16.                 marioActuel = mario[HAUT];
  17.                 deplacerJoueur(carte, &positionJoueur, HAUT);
  18.                 break;
  19.             case SDLK_DOWN:
  20.                 marioActuel = mario[BAS];
  21.                 deplacerJoueur(carte, &positionJoueur, BAS);
  22.                 break;
  23.             case SDLK_RIGHT:
  24.                 marioActuel = mario[DROITE];
  25.                 deplacerJoueur(carte, &positionJoueur, DROITE);
  26.                 break;
  27.             case SDLK_LEFT:
  28.                 marioActuel = mario[GAUCHE];
  29.                 deplacerJoueur(carte, &positionJoueur, GAUCHE);
  30.                 break;
  31.         }
  32.         break;
  33. }
  34.         // Effacement de l'écran
  35.         SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
  36.         // Placement des objets à l'écran
  37.         objectifsRestants = 0;
  38.         for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
  39.         {
  40.             for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
  41.             {
  42.                 position.x = i * TAILLE_BLOC;
  43.                 position.y = j * TAILLE_BLOC;
  44.                 switch(carte[i][j])
  45.                 {
  46.                     case MUR:
  47.                         SDL_BlitSurface(mur, NULL, ecran, &position);
  48.                         break;
  49.                     case CAISSE:
  50.                         SDL_BlitSurface(caisse, NULL, ecran, &position);
  51.                         break;
  52.                     case CAISSE_OK:
  53.                         SDL_BlitSurface(caisseOK, NULL, ecran, &position);
  54.                         break;
  55.                     case OBJECTIF:
  56.                         SDL_BlitSurface(objectif, NULL, ecran, &position);
  57.                         objectifsRestants = 1;
  58.                         break;
  59.                 }
  60.             }
  61.         }
  62.         // Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
  63.         if (!objectifsRestants)
  64.             continuer = 0;
  65.         // On place le joueur à la bonne position
  66.         position.x = positionJoueur.x * TAILLE_BLOC;
  67.         position.y = positionJoueur.y * TAILLE_BLOC;
  68.         SDL_BlitSurface(marioActuel, NULL, ecran, &position);
  69.         SDL_Flip(ecran);
  70.     }


 
- Ce qui fait qu'à chaque tour de la boucle "while" le tableau ne soit pas réinitialiser à son état d'origine. En gros, pourquoi si je bouge une caisse, elle restera là où je l'ai laissé à la prochaine boucle du "while" ?
 

Reply

Marsh Posté le 01-05-2012 à 10:50:48   

Reply

Marsh Posté le 01-05-2012 à 16:07:47    

De quel tableau tu parle ? "carte" ? Il est déclaré à l'extérieur de la boucle, donc aucune raison pour qu'il soit réinitialisé. Ce tableau est sensé être modifié dans deplacerJoueur(). Montre peut-être le code de cette fonction... parce que tel quel le code à l'air correct.

Reply

Marsh Posté le 01-05-2012 à 17:05:34    

Le code est correct et il n'y a pas d'erreur à trouver, c'est juste moi qui ne comprends pas où se passe la mise en mémoire de l'interaction....
 

Code :
  1. void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
  2. {
  3.     switch(direction)
  4.     {
  5.         case HAUT:
  6.             if (pos->y - 1 < 0) // Si le joueur dépasse l'écran, on arrête
  7.                 break;
  8.             if (carte[pos->x][pos->y - 1] == MUR) // S'il y a un mur, on arrête
  9.                 break;
  10.             // Si on veut pousser une caisse, il faut vérifier qu'il n'y a pas de mur derrière (ou une autre caisse, ou la limite du monde)
  11.             if ((carte[pos->x][pos->y - 1] == CAISSE || carte[pos->x][pos->y - 1] == CAISSE_OK) &&
  12.                 (pos->y - 2 < 0 || carte[pos->x][pos->y - 2] == MUR ||
  13.                 carte[pos->x][pos->y - 2] == CAISSE || carte[pos->x][pos->y - 2] == CAISSE_OK))
  14.                 break;
  15.             // Si on arrive là, c'est qu'on peut déplacer le joueur !
  16.             // On vérifie d'abord s'il y a une caisse à déplacer
  17.             deplacerCaisse(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);
  18.             pos->y--; // On peut enfin faire monter le joueur (oufff !)
  19.             break;
  20.         case BAS:
  21. ETC.....

Reply

Marsh Posté le 01-05-2012 à 17:15:09    

Bah il est devant toi. Tout l'état du jeu est contenu dans le tableau "carte": mur, caisse, caisse à la bonne position, joueur. La fonction deplacerJoueur() ne fait "que" modifier ce tableau en fonction des déplacements et des contraintes du jeu. Une fois l'événement traité, le tableau est utilisé pour redessiner l'intégralité de la carte, en double-buffering.

Reply

Sujets relatifs:

Leave a Replay

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