begin process at 2012 05 30 02:24:11
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

[jeu 2d] Snake ,petit bug jeu


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

[jeu 2d] Snake ,petit bug jeu

dimanche 16 octobre 2011 à 17:09:09 | [jeu 2d] Snake ,petit bug jeu

zakuza

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


Partie qui modifie les positions de la bête

Code C/C++ :
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];
    }

  
}


Code C/C++ :

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);

   }
dimanche 16 octobre 2011 à 17:14:23 | Re : [jeu 2d] Snake ,petit bug jeu

zakuza

J oubliais j'ai fait une petite video qui montre bien le decalage que j'ai au debut
[ Lien ]
lundi 17 octobre 2011 à 11:19:19 | Re : [jeu 2d] Snake ,petit bug jeu

buno

Administrateur CodeS-SourceS
Réponse acceptée !
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...
mardi 18 octobre 2011 à 19:49:46 | Re : [jeu 2d] Snake ,petit bug jeu

zakuza

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&#8217;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


Cette discussion est classée dans : case, break, position, sdl, positionteteserpent


Répondre à ce message

Sujets en rapport avec ce message

GESTION CLAVIER SDL [ par Batman60 ] voici un bout de code qui  sert à me déplacer dans une scène 3D opengl ,le problème c'est qu'il faut à chaque fois appuyer sur la touche pour ce dépla SDL porbleme [ par fahdovski ] IL Y'A EXECUTION MAIS LE PC PLANTE IL DEVIENT TRES LENT, MAIS POURQUOI??????jE TRAVAILLE SUR CODE::BLOCKS SOUS LINUXAVANT CA MARCHAIS IMPEC QUESQUI C' pour que mes touches soient détectées immédiatement [ par snake57 ] Bonjour,j'ai un petit soucis avec la détection de touche. Je vous met le bout de code concerné plus bas pour que vous ayez une idée.Enfait je détecte Deplacement de plusieurs sprites à l'écran (SDL) [ par rasolofomanana ] Bonjour à tous, je débute en C et j'essaie de créer un programme où l'on peut déplacer plusieurs sprites à l'écran, par cases de 40px. Le problème es Touches clavier [ par F0ra ] Salut,Mon problème c'est que ça ne fonctionne pas quand j'appuie sur la touche de droite et bas en même temps par exemple.Que faire ?case WM_KEYDOWN:s logiciel Borland C++ et DevC++ [ par waldomania ] Bonjour, j'ai un grand problème car j'ai programmé un mini projet sur un Dev C++ mais ça marche pas à Borland C++ le projet est en langage c (!=C++) Récupérer les événements sur une frame dans C++ via JNI [ par PleoX ] Bonjour,(J'espère avoir mis mon sujet dans le bon thème. J'ai pas trouvé de thème plus aproprié.)Je suis en train de créer une application multi-touch Violation d'accès mémoire [ par zoneart ] Bonjour,Je suis débutant et j'ai écris deux trois lignes de codes que j'aimerais vous soumettre car une erreur de violation d'accès mémoire survient l moteur physique [ par Jackyzgood ] Bonjour à tous ! J'essaye actuellement de créer une fonction qui me gère des trajectoires simple dans un champ de pesanteur avec rebond. Mon problème


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales