Partage
  • Partager sur Facebook
  • Partager sur Twitter

Plusieurs SDL_Event

SDL_Event event, event2; (petite explication )

    8 mai 2006 à 19:07:49

    Bonjour,

    Voilà je me demandais si je pouvais faire un SDL_WaitEvent(&event) avec ensuite un SDL_PollEvent(&event2)comme ceci:


        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch (event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                break;

                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_DOWN:
                            if (marioActuel == mario[GAUCHE])
                                marioActuel = mario[ABAISSE_GAUCHE];
                            if (marioActuel == mario[DROITE])
                                marioActuel = mario[ABAISSE_DROITE];
                        break;

                        case SDLK_LEFT:
                            marioActuel = mario[GAUCHE];
                            deplacerJoueur(carte,&positionMario,GAUCHE);
                        break;

                        case SDLK_RIGHT:
                            marioActuel = mario[DROITE];
                            deplacerJoueur(carte,&positionMario,DROITE);
                        break;
                    }
                break;
            }

            SDL_PollEvent(&event2);
            switch(event2.type)
            {
                case SDL_KEYDOWN:
                    switch (event2.key.keysym.sym)
                    {
                        case SDLK_UP:
                            if (marioActuel == mario[GAUCHE])
                                marioActuel = mario[SAUTE_GAUCHE];
                            if (marioActuel == mario[DROITE])
                                marioActuel = mario[SAUTE_DROITE];
                            positionMario.y--;

                        break;
                    }
                break;
            }

            /* Système de gravité */
            tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > 200)
            {
                positionMario.y++;
                tempsPrecedent = tempsActuel;
            }

            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));

            /* Placement des objets à l'écran */
            for (i = 0 ; i < NB_BLOC_LARGEUR ; i++)
            {
                for (j = 0 ; j < NB_BLOC_HAUTEUR ; j++)
                {
                    position.x = i * TAILLE_BLOC;
                    position.y = j * TAILLE_BLOC;

                    switch (carte[i][j])
                    {
                        case MUR:
                            SDL_BlitSurface(mur,NULL,ecran,&position);
                        break;

                        case SOL:
                            SDL_BlitSurface(sol,NULL,ecran,&position);
                        break;

                        case CAISSE:
                            SDL_BlitSurface(caisse,NULL,ecran,&position);
                        break;
                    }
                }
            }

            position.x = positionMario.x * TAILLE_BLOC;
            position.y = positionMario.y * TAILLE_BLOC;
            SDL_BlitSurface(marioActuel,NULL,ecran,&position);
            SDL_Flip(ecran);
        }


    J'ai surement écris une absurdité mais je me dis comment puis-je obtenir le résultat que je veux sans faire ca. Je m'explique:

    Je voudrais faire un système de gravité comme vous pouvez le voir mais pour ca j'ai besoin des fonction time de la SDL ( SDL_GetTicks(); ) Pour la faire fonctionner je dois mettre SDL_WaitEvent(&event) en PollEvent, mais si je met SDL_PollEvent(&event); le problème est que mon Mario bouge trop vite alors j'ai crée un SDL_Waitevent (&event) pour les déplacements et un SDL_PollEvent(&event2) pour le système de gravité. Pourquoi ca ne marche pas comme prévu en fait? Autrement dit, comment dois-je faire ?

    Merci d'avance à tous

    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2006 à 20:07:48

      Salut !
      Le fait d'utiliser SDL_WaitEvent arrete completement ton programme; résultat, tu ne peux pas appliquer la gravité tant que tu ne deplace pas Mario...ce qui a un intéret limité.

      Donc, si j'ai bien compris ce que tu cherches à faire, je pense qu'il te suffit de mettre tout ce que contient ta boucle while à l'intérieur de ta condition sur le temps. Apres, tu supprimes le SDL_WaitEvent et le deuxieme switch. Ca devrait donner qulquechose comme ca :

      while (continuer)
      {
          tempsActuel = SDL_GetTicks();
          if (tempsActuel - tempsPrecedent > 200)
          {
              SDL_PollEvent(&event);
              switch (event.type)
              {
                  case SDL_QUIT:
                  continuer = 0;
                  break;

                  case SDL_KEYDOWN:
                  switch(event.key.keysym.sym)
                  {
                      case SDLK_DOWN:
                      if (marioActuel == mario[GAUCHE])
                          marioActuel = mario[ABAISSE_GAUCHE];
                      if (marioActuel == mario[DROITE])
                          marioActuel = mario[ABAISSE_DROITE];
                      break;

                      case SDLK_LEFT:
                      marioActuel = mario[GAUCHE];
                      deplacerJoueur(carte,&positionMario,GAUCHE);
                      break;

                      case SDLK_RIGHT:
                      marioActuel = mario[DROITE];
                      deplacerJoueur(carte,&positionMario,DROITE);
                      break;

                      case SDLK_UP:
                      if (marioActuel == mario[GAUCHE])
                          marioActuel = mario[SAUTE_GAUCHE];
                      if (marioActuel == mario[DROITE])
                          marioActuel = mario[SAUTE_DROITE];
                      positionMario.y--;

                      break;
                  }
                  break;
              }

              // on applique la gravité
              positionMario.y++;
              tempsPrecedent = tempsActuel;


              SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));

              /* Placement des objets à l'écran */
              for (i = 0 ; i < NB_BLOC_LARGEUR ; i++)
              {
                  for (j = 0 ; j < NB_BLOC_HAUTEUR ; j++)
                  {
                      position.x = i * TAILLE_BLOC;
                      position.y = j * TAILLE_BLOC;

                      switch (carte[i][j])
                      {
                          case MUR:
                          SDL_BlitSurface(mur,NULL,ecran,&position);
                          break;

                          case SOL:
                          SDL_BlitSurface(sol,NULL,ecran,&position);
                          break;

                          case CAISSE:
                          SDL_BlitSurface(caisse,NULL,ecran,&position);
                          break;
                      }
                  }
              }

              position.x = positionMario.x * TAILLE_BLOC;
              position.y = positionMario.y * TAILLE_BLOC;
              SDL_BlitSurface(marioActuel,NULL,ecran,&position);
              SDL_Flip(ecran);
          }
      }


      Là, ca devrait marcher (en théorie et sauf erreur de ma part). Sinon, il se peut que tu aies quelques petits réglages à faire...

      Enfin, l'idée a retenir, c'est que tu ne fais quelque chose dans ta boucle que toutes les 200ms.
      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2006 à 8:52:44

        Attention !! Un pollevent supprime les évenements, donc un deuxieme pollevent de fonctionnera pas !!
        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2006 à 16:10:55

          Alors comment puis-je utiliser un SDL_WaitEvent pour les déplacement et un SDL_PollEvent pour les timers ?
          • Partager sur Facebook
          • Partager sur Twitter
            9 mai 2006 à 16:56:09

            Je ne vois pas l'interet de faire 2 boucle d'événements ;)
            • Partager sur Facebook
            • Partager sur Twitter
              9 mai 2006 à 17:02:46

              Ok, je me pose une autre question alors. Comment puis-je modifier la vitesse de déplacement de mon Mario (avec SDL_PollEvent) étant donné que SDL_EnableRepeatKey ne sert à rien avec SDL_PollEvent. Et comment enlever cette répétition des touches quand j'appuye sur la haut par exemple ^^
              • Partager sur Facebook
              • Partager sur Twitter

              Plusieurs SDL_Event

              × 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