[jeu 2d] Snake ,petit bug jeu [Résolu]

Messages postés
5
Date d'inscription
samedi 8 avril 2006
Statut
Membre
Dernière intervention
19 juillet 2012
- - Dernière réponse : cs_zakuza
Messages postés
5
Date d'inscription
samedi 8 avril 2006
Statut
Membre
Dernière intervention
19 juillet 2012
- 18 oct. 2011 à 19:49
Bonjour à tous ,
je suis entrain de m'amuser à programmer un petit snake histoire de pratiquer,bon il ne fonctionne pas trop mal mais j'ai quelques bugs que je ne comprend pas .

La méthode que j'utilise est la suivante:

j'ai découpe mon snake en 3 parties .

1-la tête qui à une position unique .
2-le corps qui à autant de position différentes que de parties , donc j'utilise un SDL_Rect de type tableau .
3-la queue qui n'a qu'une position également.

lorsque je charge ma carte dans un tableau 2d (à partir d'un fichier texte), je récupéré les positions de départ de toutes les parties du bestiaux (à la manière du sokoban).
Pour ensuite les blitter à l’écran après avoir blitter la carte . toutes les 120 milliseceondes, la boucle refait un tour .

à ce stade le snake ne bouge pas donc . Si j'appuie sur une des flèches (keyup) , j'initialise un booléen à 1 ,ainsi qu'une direction dans laquelle mon snake doit avancer.

ensuite, une fois le booléen à 1 est ma direction choisie, j’appelle une fonction qui va modifier les positions des partie de mon snake toutes les 120 milisec.

J'ai procède de la façon suivante :

1: j'enregistre la position de la tête, puis selon la direction choisi, la tête prend une nouvelle position x et y ,

2: j'enregistre la position[0] du corps ,donc de la partie 1 , et je lui donne la position précédente de la tête .

3: j'enregistre la position[1] du corps (partie2) et lui donne la position précédente de la partie1 .

4: ainsi de suite pour chaque parties .

5 :et enfin je donne a la queue la position que possédait la dernière partie du corps .


Je retourne a ma boucle d’événement et je bitte les images avec leur nouvelles positions .

Je vais mettre la partie du code qui correspond pour que vous y voyez plus clair .
ainsi qu'un lien pour télécharger l'exe .

Les bugs que j'ai sont les suivants :
Au début j'ai un décalage que je ne m'explique pas , ensuite à chaque fois que le snake mange une pomme, sa queue se blitte à un endroit inexpliqué (mais forcement logique) de la carte pour ensuite continuer à coller au bestiaux ... (ce dernier bug est reglé j'ai modifie le code source)

Voila merci d'avance à ceux qui auront le courage de lire le pavé ainsi que le code et surtout à ceux qui voudront bien m'aider à résoudre ce petit bug :)

voila l'exe ["http://www.megaupload.com/?d=1M0VQR0C" http://www.megaupload.com/?d=1M0VQR0C]


Partie qui modifie les positions de la bête

void modifierPositionsSerpent(SDL_Rect *positionTeteSerpent,
SDL_Rect positionCorps[],SDL_Rect *positionQueue,int* partiesCorps,
int direction,int carte[][40])
{


int teteX=positionTeteSerpent->x;// je sauvegarde la position de la tete
int teteY=positionTeteSerpent->y;
int i=1,j=0;
int corpsX[40]={NULL},corpsY[40]={NULL};


switch(direction) //je modifie la position de la tete selon la direction
{
   case DROITE:
   positionTeteSerpent->x+=15;
   break;
   case GAUCHE:
   positionTeteSerpent->x-=15;
   break;
   case BAS:
   positionTeteSerpent->y+=15;
   break;
   case HAUT:
   positionTeteSerpent->y-=15;
   break;
}

int pommeMange=0;
switch(carte[positionTeteSerpent->x/15][positionTeteSerpent->y/15])
{
case POMME2:
carte[positionTeteSerpent->x/15][positionTeteSerpent->y/15]=VIDE2;
*partiesCorps=*partiesCorps+1;
 pommeMange=1;
break;
case CARRE_OBSTACLE2:
break;


}


corpsX[0]=positionCorps[0].x;//je sauvegarde la position du corps
corpsY[0]=positionCorps[0].y;

positionCorps[0].x=teteX;// donne a la premiere partie du corps la position
positionCorps[0].y=teteY;// de la tete



  for(i=1;i<*partiesCorps;i++)
  {
  corpsX[i]=positionCorps[i].x,corpsY[i]=positionCorps[i].y;
  //j'enregistre la position du corps avant de la modifier 
  positionCorps[i].x=corpsX[j], positionCorps[i].y=corpsY[j];
 //et je donne a la partie du corps qui suit la position enregistre
  j++;
  }



    if(!pommeMange)
    {
        positionQueue->x=corpsX[j];
        positionQueue->y=corpsY[j];
    }

  
}



Boucle principale du jeu 

<code type="c">
while(continuer)
   {

   SDL_PollEvent(&event);

        switch(event.type)
        {
        case SDL_QUIT:
        continuer = 0;
        break;
        case SDL_KEYDOWN:
             switch (event.key.keysym.sym)
             {

             case SDLK_UP:
             deplacement=1;
             direction=HAUT;
             break;
             case SDLK_DOWN:
             deplacement=1;
             direction=BAS;
             break;
             case SDLK_RIGHT:
             deplacement=1;
             direction=DROITE;
             break;
             case SDLK_LEFT:
             deplacement=1;
             direction=GAUCHE;
             break;

             }

        break;
        }




      SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format,255, 255, 255));
      map(fenetre,imagesCorps,images,position,carte);


     tempsActuel = SDL_GetTicks();
     if (tempsActuel - tempsPrecedent > 120)
     {

         if(deplacement)//ici j apelle la fonction de modification une fois le boleen à 1
         modifierPositionsSerpent(&positionTeteSerpent,positionCorps,&positionQueue,
         &partiesCorps,direction,carte);

     tempsPrecedent = tempsActuel;
     }
     else
     {
     SDL_Delay(120 - (tempsActuel - tempsPrecedent));
     }


     // je blitte la tete
      SDL_BlitSurface(images[TETE], NULL, fenetre,&positionTeteSerpent);
 
      // je blitte les differentes parties du corps
      for(i=0;i<partiesCorps;i++)
      {
      SDL_BlitSurface(images[CARRE_OBSTACLE], NULL, fenetre,&positionCorps[i]);
      }
     // et enfin le cul
      SDL_BlitSurface(images[QUEUE], NULL, fenetre,&positionQueue);


    SDL_Flip(fenetre);

   }
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
14636
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 octobre 2019
90
3
Merci
Hello,
ça, c'est de la demande détaillée
Bon, je n'ai pas regardé le code, mais, au vue de la vidéo, il semble que ce soit un problème d'init: j'ai l'impression que la position de la queue est initialisée avec la position de la tête, l'avant-dernière avec la 1ère,etc...
Sinon, je n'aurais pas fait comme toi: plutôt que de déplacer le corps en entier, tu peux, à chaque déplacement:
- ajouter un nouveau morceau au début du corps avec l'ancienne position de la tête
- supprimer la queue
- remplacer le dernier élément par la queue


@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BunoCS
Messages postés
5
Date d'inscription
samedi 8 avril 2006
Statut
Membre
Dernière intervention
19 juillet 2012
0
Merci
J oubliais j'ai fait une petite video qui montre bien le decalage que j'ai au debut
http://www.youtube.com/watch?v=FwuN9q5xVd0
Commenter la réponse de cs_zakuza
Messages postés
5
Date d'inscription
samedi 8 avril 2006
Statut
Membre
Dernière intervention
19 juillet 2012
0
Merci
Bonsoir merci pour ta réponse , oui j'ai bien détaille ,histoire de ne pas décourager les gens en mettant uniquement le code source et une vague explications , ce n'est pas tjs vident de se plonger dans le code d'un autre .

Vous avez bien vu c'était exactement ça le problème, au moment ou j’enregistrai les positions du corps, l'ordre était inversé par rapport à celui dans lequel je les faisait bouger.
Donc le problème est réglé, je testerai votre techniques
Commenter la réponse de cs_zakuza