Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]Un zozor qui traine et qui bourdonne...

Je sens que c'est pas normal

Sujet résolu
    15 avril 2006 à 12:43:41

    Salut à tous.
    Aprés avoir lu le cours de M@teo, j'ai pratiqué... et là, mon PC me fait un étrange petit bourdonnement uniquement quand je bouge zozor (que ce soit avec le clavier ou la souris) : pas franchement rassurant...

    Et sinon, quand je passe en mode plein ecran, zozor suit tres peniblement la souris (2 ou 3 secondes de retard). Je comprends pas pourquoi, puisque sans ca, ca marche tres bien.

    Je sais pas si mon code est utile mais si vous le voulez : reclamez !

    Merci.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 avril 2006 à 13:05:47

      Ca m'est arrivé d'avoir ce sale bourdonnement en bougeant la souris, revérifie ton code, sinon, montre le
      • Partager sur Facebook
      • Partager sur Twitter
        15 avril 2006 à 13:12:09

        Voila le code :


        #include <stdlib.h>
        #include <stdio.h>
        #include <SDL/SDL.h>
        #include <SDL/SDL_image.h>
        #include "fonctions.h"


        int main(int argc, char *argv[])
        {
            SDL_Event event;
            SDL_Surface *ecran = NULL, *image = NULL, *zozor = NULL, *sapin = NULL;
            SDL_Rect position, pzozor, psapin;
            int i = 0;
            int continuer = 1;


            SDL_Init(SDL_INIT_VIDEO);
            ecran = SDL_SetVideoMode(1200, 700, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
            SDL_WM_SetCaption("Zozor", NULL);

            pzozor.x = 500;
            pzozor.y = 260;
            position.x = 0;
            position.y = 0;
            psapin.x = 300;
            psapin.y = 400;

            image=IMG_Load("lac_en_montagne.bmp");
            zozor=IMG_Load("zozor.bmp");
            SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));
            sapin=IMG_Load("sapin.png");
            SDL_EnableKeyRepeat(10, 10);
            SDL_ShowCursor(SDL_DISABLE);

            while (continuer)
            {
                SDL_WaitEvent(&event);
                move(&event, &pzozor);
                continuer=pause(&event, continuer);

                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                SDL_BlitSurface(image, NULL, ecran, &position);
                SDL_BlitSurface(zozor, NULL, ecran, &pzozor);
                SDL_BlitSurface(sapin, NULL, ecran, &psapin);

                SDL_Flip(ecran);
            }


            SDL_FreeSurface(image);
            SDL_FreeSurface(zozor);
            SDL_FreeSurface(sapin);
            SDL_Quit();

            return EXIT_SUCCESS;
        }


        et


        #include <stdlib.h>
        #include <stdio.h>
        #include <SDL/SDL.h>



        int pause(SDL_Event* event, int continuer)
        {
            switch(event->type)
            {
                case SDL_QUIT: continuer = 0; break;
                case SDL_KEYDOWN:
                    switch (event->key.keysym.sym)
                        {case SDLK_ESCAPE: continuer = 0; break;}
                    break;
            }
            return continuer;
        }




        //*************************************************************************************************************




        void move(SDL_Event* event, SDL_Rect* pos)
        {
            switch(event->type)
            {
                case SDL_KEYDOWN:
                    switch (event->key.keysym.sym)
                    {
                        case SDLK_a: pos->x = pos->x - 5; break;
                        case SDLK_d: pos->x = pos->x + 5; break;
                        case SDLK_w: pos->y = pos->y - 5; break;
                        case SDLK_s: pos->y = pos->y + 5; break;
                    }
                    break;
                case SDL_MOUSEMOTION:
                    if (event->motion.x != pos->x && event->motion.y != pos->y)
                    {
                        pos->x = event->motion.x;
                        pos->y = event->motion.y;
                    }
                    break;
                case SDL_MOUSEBUTTONUP:
                    pos->x = event->button.x;
                    pos->y = event->button.y;
                    break;
            }


            if (pos->x < 0)
                pos->x = 0;
            else if (pos->y < 0)
                pos->y = 0;
            else if (pos->x > 760)
                pos->x = 760;
            else if (pos->y > 540)
                pos->y = 540;
        }


        Je suis désolé pour l'absence de tout commentaire, mais c'est pas trop compliqué normalement...
        • Partager sur Facebook
        • Partager sur Twitter
          15 avril 2006 à 13:26:02

          Erreur :


          - Tu ne fais pas de boucle d'evènement
          - Ce serait plus lisible si tu utilisais des . au lieu des -> comme dans le cours
          void move(SDL_Event* event, SDL_Rect* pos)
          {
          int continuer = 1;
          while(continuer)
          {
              SDL_WaitEvent(&event);
              switch(event.type)
              {
                  case SDL_QUIT:
                  continuer = 0;
                  break;

                  case SDL_KEYDOWN:
                      switch (event.key.keysym.sym)
                      {
                          case SDLK_a: pos.x = pos.x - 5; break;
                          case SDLK_d: pos.x = pos.x + 5; break;
                          case SDLK_w: pos.y = pos.y - 5; break;
                          case SDLK_s: pos.y = pos.y + 5; break;
                      }
                      break;

                  case SDL_MOUSEMOTION:
                      if (event.motion.x != pos.x && event.motion.y != pos.y)
                      {
                          pos.x = event.motion.x;
                          pos.y = event.motion.y;
                      }
                      break;
                  case SDL_MOUSEBUTTONUP:
                      pos.x = event.button.x;
                      pos.y = event.button.y;
                      break;
              }

              //Inutile car zozor ne saurait pas sortir de l'écran : je pense
              if (pos.x < 0)
                  pos.x = 0;
              else if (pos.y < 0)
                  pos.y = 0;
              else if (pos.x > 760)
                  pos.x = 760;
              else if (pos.y > 540)
                  pos.y = 540;
          }
          }
          • Partager sur Facebook
          • Partager sur Twitter
            15 avril 2006 à 13:40:16

            Pour la question des . au lieu des ->, je crois que -> est obligatoire pour atteindre un élément d'une structure à partir d'un pointeur. (En tous cas, quand j'essaye avec un point ca marche pas.)

            Et pour la boucle d'événement, je suis pas sûr de comprendre. Ca va pas ça ?

            while (continuer)
                {
                    SDL_WaitEvent(&event);
                    move(&event, &pzozor);
                    continuer=pause(&event, continuer);

                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                    SDL_BlitSurface(image, NULL, ecran, &position);
                    SDL_BlitSurface(zozor, NULL, ecran, &pzozor);
                    SDL_BlitSurface(sapin, NULL, ecran, &psapin);

                    SDL_Flip(ecran);
                }
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 avril 2006 à 13:47:29

              Dans la fonction pause, tu n'est pas obligé de passer continuer en paramètre, tu pourrais très bien faire ceci :

              int pause(SDL_Event* event)//Ligne changée
              {
                  int continuer; // ligne changée
                  switch(event->type)
                  {
                      case SDL_QUIT:
                          continuer = 0;
                          break;
                      case SDL_KEYDOWN:
                          switch (event->key.keysym.sym)
                              {
                                  case SDLK_ESCAPE:
                                      continuer = 0;
                                      break;
                              }
                          break;
                  }
                  return continuer;
              }


              J'ai indiqué les lignes changées, et n'aie pas peur de mettre de l'espace dans ton codes, ca le rendra beaucoup plus lisible
              • Partager sur Facebook
              • Partager sur Twitter
                15 avril 2006 à 13:57:14

                Tu fait pas une boucle infini ? Je vois nul part continuer = 0;
                • Partager sur Facebook
                • Partager sur Twitter
                  15 avril 2006 à 19:41:23

                  Le continuer=0 est dans la fonction pause().


                  Et pour ce conseil...

                  Citation : Acieroid

                  tu n'est pas obligé de passer continuer en paramètre

                  ...t'as raison, merci.


                  Pour le ralentissement, j'ai trouvé ce qui ne va pas. En fait, en utilisant SDL_PollEvent on remple une pile d'evenements qui sont ensuite tous traités. J'ai donc cherché un moyen de vider la pile à chaque tour de boucle :

                  //supprime jusqu'a 1000 evenements de type mousemotion de la pile
                  SDL_PeepEvents(event, 1000, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION));

                  • Partager sur Facebook
                  • Partager sur Twitter

                  [SDL]Un zozor qui traine et qui bourdonne...

                  × 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