Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]Deplacement vers le bas d'une surface

Sujet résolu
    16 avril 2006 à 22:57:12

    Bonjour à vous amis Zéros !

    J'ai besoin de votre aide ce soir, pour un problème que j'ai retourné dans tous les sens et je ne vois vraiment pas d'où est sa source.

    Donc en fait j'ai commencé à créer un "Snake", et je bloque déjà presque dès le début.
    En effet, quand j'appuie sur chaque touche du clavier directionnelle ça change de direction, mais le problème est que quand j'appuie sur la touche "bas" mon snake va à droite.

    Voici mon code :
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *snake = NULL;
        SDL_Rect positionSnake;

        SDL_Event event; /* Cette variable servira plus tard à gérer les évènements */
        int continuer = 1, haut = 0, bas = 0, droite = 0, gauche = 1;

        SDL_Init(SDL_INIT_VIDEO);

        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Snake", NULL);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        snake = SDL_CreateRGBSurface(SDL_HWSURFACE, 10, 10, 32, 0, 0, 0, 0);
        SDL_FillRect(snake, NULL, SDL_MapRGB(ecran->format, 255, 0, 255));
        positionSnake.x = ecran->w / 2 - snake->w / 2;
        positionSnake.y = ecran->h / 2 - snake->h / 2;
        SDL_BlitSurface(snake, NULL, ecran, &positionSnake);

        while (continuer && positionSnake.x < 630 && positionSnake.y < 470 && positionSnake.x > 0 && positionSnake.y > 0)
        {
            SDL_PollEvent(&event); /* Récupèration de l'évènement dans event */

            switch(event.type) /* Test du type d'évènement */
            {
                case SDL_QUIT: /* Si c'est un évènement de type "Quitter" */
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch (event.key.keysym.sym)
                    {
                        case SDLK_UP:
                            if (bas)
                            {
                                break;
                            }
                            else
                            {
                                bas = 0;
                                droite = 0;
                                gauche = 0;
                                haut = 1;
                            }
                        case SDLK_DOWN:
                            if (haut)
                            {
                                break;
                            }
                            else
                            {
                                droite = 0;
                                gauche = 0;
                                haut = 0;
                                bas = 1;
                            }
                        case SDLK_RIGHT:
                            if (gauche)
                            {
                                break;
                            }
                            else
                            {
                                bas = 0;
                                gauche = 0;
                                haut = 0;
                                droite = 1;
                            }
                        case SDLK_LEFT:
                            if (droite)
                            {
                                break;
                            }
                            else
                            {
                                droite = 0;
                                bas = 0;
                                haut = 0;
                                gauche = 1;
                            }
                    }
                    break;
            }
            if(haut)
                positionSnake.y--;
            else if(bas)
                positionSnake.y++;
            else if(droite)
                positionSnake.x++;
            else if(gauche)
                positionSnake.x--;

            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(snake, NULL, ecran, &positionSnake);
            SDL_Flip(ecran);
        }

        SDL_FreeSurface(snake);

        SDL_Quit();

        return EXIT_SUCCESS;
    }


    Ca m'étonne d'autant plus que je ne vois pas du tout la différence entre mes case SDLK_DOWN qu'avec les autres...

    Si quelqu'un a la solution à mon problème, merci de me la communiquer.

    A bientot.
    • Partager sur Facebook
    • Partager sur Twitter
      16 avril 2006 à 23:27:15

      Salut, c'est simple mets des break; a ses endroits:
      case SDLK_UP:
       if (bas)
       {
           break;
       }
       else
       {
            bas = 0;
            droite = 0;
            gauche = 0;
            haut = 1;
       }
      break;//<-- ici

      • Partager sur Facebook
      • Partager sur Twitter
        16 avril 2006 à 23:27:34

        hmmm .. faudrait pas faire des break a chaque case de ton switch ? (apres le else) ...

        Edit : Je pense qu'on peut raccourcir un peu ton truc en faisant ca :

        case SDLK_UP:
         if (!bas)
         {
              bas = 0;
              droite = 0;
              gauche = 0;
              haut = 1;
         }
         break;
        • Partager sur Facebook
        • Partager sur Twitter
          16 avril 2006 à 23:37:35

          Ah oui merci bien j'avais oublié ce foutu break :o
          Merci aussi à toi Rick, c'est vrai que je n'y avais pas pensé :)
          • Partager sur Facebook
          • Partager sur Twitter

          [SDL]Deplacement vers le bas d'une surface

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown