Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1532 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2139873
caps lock
Posté le 01-05-2012 à 10:50:48  profilanswer
 

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" ?
 

mood
Publicité
Posté le 01-05-2012 à 10:50:48  profilanswer
 

n°2139942
tpierron
Posté le 01-05-2012 à 16:07:47  profilanswer
 

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.

n°2139954
caps lock
Posté le 01-05-2012 à 17:05:34  profilanswer
 

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.....

n°2139955
tpierron
Posté le 01-05-2012 à 17:15:09  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[C# .net] Navigation vers un TAB précis d'un FORM.fonction qui transforme une matrice en vecteur en langage C
Calcul de la norme d'un vecteur généré de façon aléatoire en langage COuvrir un fichier en C
Lire port série C# et convertir en texteLe C est-il mieux que le C# ?
[C#] Remplacer le symbole € par valeur hexadecimale [Résolu]pacman en C
[C] débutant a=b différent de b=a ?analyseur lexical en C
Plus de sujets relatifs à : [C] SDL avec combo BlitSurface() + Flip()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR