Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Plusieurs Bugs

Mon pikachu ne veut pas sortir de la fenêtre

    31 août 2007 à 19:50:47

    Bonsoir :p

    Je me suis remis à la SDL et je suis à la gestion du temps. J'ai essayé de faire pour qu'un pikachu court vers la gauche sans s'arrêter -> il devrait donc au bout d'un moment sortir de l'écran. Oui mais voilà le rongeur n'en a pas décidé comme ça et il reste coincé le bourgre >_<
    De plus, mon perso se déplace beaucoup plus rapidement depuis que j'ai mis mon pikachu et je comprends pas pourquoi on le lui a rien demandé :euh:

    Ressources:
    Main.c
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <SDL/SDL.h>
    4. #include <SDL/SDL_image.h>
    5. #define DEPLACEMENTpx 3
    6. int main(int argc, char **argv)
    7. {
    8.     SDL_Surface *ecran = NULL;
    9.     SDL_Surface *link = NULL;
    10.     SDL_Surface *herbe = NULL;
    11.     SDL_Surface *pikachu = NULL;
    12.     SDL_Rect positionLink, positionHerbe, positionPikachu;
    13.     SDL_Event event;
    14.     int continuer = 1, deplacementOK = 1;
    15.     long tempsNow = 0, tempsBefore = 0;
    16.     SDL_Init(SDL_INIT_VIDEO);
    17.     ecran = SDL_SetVideoMode(400, 200, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    18.     SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    19.     SDL_WM_SetCaption("plop", NULL);
    20.     herbe = SDL_CreateRGBSurface(SDL_HWSURFACE, ecran->w, 50, 32, 0,0,0,0);
    21.     SDL_FillRect(herbe, NULL, SDL_MapRGB(ecran->format, 31, 216, 22));
    22.     positionHerbe.x = 0;
    23.     positionHerbe.y = ecran->h - herbe->h;
    24.     SDL_BlitSurface(herbe, NULL, ecran, &positionHerbe);
    25.     link = IMG_Load("link_droite.bmp");
    26.     SDL_SetColorKey(link, SDL_SRCCOLORKEY, SDL_MapRGB(ecran->format, 32, 156, 0));
    27.     positionLink.x = 0;
    28.     positionLink.y = positionHerbe.y - link->h + 3;
    29.     SDL_BlitSurface(link, NULL, ecran, &positionLink);
    30.     pikachu = IMG_Load("pikachu.gif");
    31.     positionPikachu.x = ecran->w - pikachu->w;
    32.     positionPikachu.y = positionHerbe.y - pikachu->h + 10;
    33.     SDL_BlitSurface(pikachu, NULL, ecran, &positionPikachu);
    34.     SDL_EnableKeyRepeat(50,50);
    35.     while(continuer)
    36.     {
    37.         SDL_PollEvent(&event);
    38.         tempsNow = SDL_GetTicks();
    39.         if(tempsNow - tempsBefore > 50)
    40.         {
    41.         positionPikachu.x -= 2;
    42.         tempsBefore = tempsNow;
    43.         }
    44.         switch(event.type)
    45.         {
    46.             case SDL_QUIT:
    47.             continuer = 0;
    48.             break;
    49.             case SDL_KEYDOWN:
    50.             switch(event.key.keysym.sym)
    51.             {
    52.                 case SDLK_UP:
    53.                 deplacementOK = 0;
    54.                 break;
    55.                 case SDLK_DOWN:
    56.                 deplacementOK = 0;
    57.                 break;
    58.                 case SDLK_LEFT:
    59.                 SDL_FreeSurface(link);
    60.                 link = IMG_Load("link_gauche.bmp");
    61.                 if(positionLink.x - DEPLACEMENTpx < 0)
    62.                 deplacementOK = 0;
    63.                 else {
    64.                     positionLink.x -= DEPLACEMENTpx;
    65.                 } break;
    66.                 case SDLK_RIGHT:
    67.                 SDL_FreeSurface(link);
    68.                 link = IMG_Load("link_droite.bmp");
    69.                 if(positionLink.x + DEPLACEMENTpx > ecran->w - link->w)
    70.                 deplacementOK = 0;
    71.                 else {
    72.                     positionLink.x += DEPLACEMENTpx;
    73.                 } break;
    74.         } break;
    75.     }
    76.         SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    77.         SDL_SetColorKey(link, SDL_SRCCOLORKEY, SDL_MapRGB(ecran->format, 32, 156, 0));
    78.         SDL_BlitSurface(link, NULL, ecran, &positionLink);
    79.         SDL_BlitSurface(pikachu, NULL, ecran, &positionPikachu);
    80.         SDL_BlitSurface(herbe, NULL, ecran, &positionHerbe);
    81.         SDL_Flip(ecran);
    82. }
    83.     SDL_FreeSurface(link);
    84.     SDL_FreeSurface(herbe);
    85.     SDL_FreeSurface(pikachu);
    86.     SDL_Quit();
    87.     return EXIT_SUCCESS;
    88. }


    Img:
    Image utilisateurImage utilisateurImage utilisateur

    merci de votre aide :)
    • Partager sur Facebook
    • Partager sur Twitter
      31 août 2007 à 19:59:30

      une position ne peut pas etre negatve, faut jouer avec le 2eme parametre de blitSurface
      • Partager sur Facebook
      • Partager sur Twitter
        31 août 2007 à 20:00:40

        Je ne le connais visiblement pas, une explication Chlab? :p
        • Partager sur Facebook
        • Partager sur Twitter
          31 août 2007 à 20:13:45

          le 2eme parametre dit a la fonction la partie(rectangle) a coller.

          un example:
          1. //...
          2. SDL_Rect partieAColler;
          3. partieAColler.x = posPikachu.x;
          4. partieAColler.y = posPikachu.y;
          5. partieAColler.w = pikachu->w;
          6. partieAColler.h = pikachu->h;
          7. //...
          8. posPikachu.x -= 2;
          9. if(posPikachu < 0 && partieAColler.w - partieAColler.x > 0)
          10. {
          11.         partieAColler.x += 2;
          12.         partieAColler.w -= 2;
          13. }
          14. //...
          15. SDL_BlitSurface(pikachu, &partieAColler, ecran, &posPikachu);
          16. //...



          • Partager sur Facebook
          • Partager sur Twitter
            31 août 2007 à 20:20:28

            Ca ma l'air bien compliqué ôÔ!
            Autant faire ça:
            1. Si pikachu est au bord
            2.     on ne blit pas


            ôÔ non ?
            Et pour mon second problème (le perso qui marche drôlement vite d'un coup).
            • Partager sur Facebook
            • Partager sur Twitter
              31 août 2007 à 20:28:43

              ce n'est pas si compliqué que ca, prend ton temps a comprendre le principe. essaye de passer par un timer
              • Partager sur Facebook
              • Partager sur Twitter
                31 août 2007 à 21:42:12

                Je n'avais pas encore vu les timer à vrai dire mais bon je m'y mets :)
                • Partager sur Facebook
                • Partager sur Twitter
                  31 août 2007 à 23:03:21

                  SDL sais utiliser des coordonnées négative, mais il remet les éléments négatifs a 0 aprés les avoir utilisé.

                  ce que tu peut faire c'est :



                  1. SDT_rect temp; //tu declare une nouvelle variable de position
                  2. //..... ton code
                  3. temp = positionPikachu // juste avant de blitter pikachu
                  4. SDL_BlitSurface(pikachu, NULL, ecran, &temp);



                  Tu verras, ca parait trés béte mais ca marche, l'utilisation de cette variable temp, permet de blitter pikachu, sans perdre perdre sa position.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  [SDL] Plusieurs Bugs

                  × 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