Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme SDL et evenements

Sujet résolu
    5 juin 2007 à 17:44:50

    Slt a tous!

    En ce moment j'essaie de faire un jeux de plateforme avec SDL...
    De plus je veux faire en sorte que quand l'utilisateur presse la flèche droite du clavier , et qu'en plein élan mon sprite puisse sauter en avant tant que l'utilisateur garde la main sur la fleche...Seulement , quand le sprite effectue un saut , il n'avance plus...J'ai mème essayer de creer une deuxieme variable "event" et ca marche toujours pas!

    Merci pour votre aide pasque la jsuis vraiment en galère.
    • Partager sur Facebook
    • Partager sur Twitter
      5 juin 2007 à 18:38:59

      Heu...
      Sans le code, on va avoir un peu de mal à t'aider. Néanmoins, cette question de la faq peut aider : http://www.siteduzero.com/forum-83-125906-1240939.html#r1240939
      (Penser à la FAQ ;) ).
      • Partager sur Facebook
      • Partager sur Twitter
      J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
        5 juin 2007 à 20:46:03

        SDL_PollEvent(&event);

        if(event.type == SDL_QUIT)
        {
        continuer = 0;
        }
        if(event.type == SDL_KEYDOWN)
        {

        if(event.key.keysym.sym == SDLK_RIGHT)
        {
        SDL_PollEvent(&event2);
        if(event2.key.keysym.sym == SDLK_SPACE)
        {
        position_sprite.y+=130;
        }
        position_sprite.x+=2;
        imageFond = SDL_LoadBMP("environnement.bmp");
        SDL_BlitSurface(imageFond ,NULL , ecran , &position_imageFond);
        SDL_BlitSurface(sprite , NULL , ecran , &position_sprite);
        SDL_Flip(ecran);
        }
        • Partager sur Facebook
        • Partager sur Twitter
          5 juin 2007 à 21:38:00

          Le mieux serait d'utiliser < code type = "c" > et </code > pour poster ton code sur le forum. Ca nous donnerai :
          SDL_PollEvent(&event);

          if(event.type == SDL_QUIT)
          {
          continuer = 0;
          }
          if(event.type == SDL_KEYDOWN)
          {

          if(event.key.keysym.sym == SDLK_RIGHT)
          {
          SDL_PollEvent(&event2);
          if(event2.key.keysym.sym == SDLK_SPACE)
          {
          position_sprite.y+=130;
          }
          position_sprite.x+=2;
          imageFond = SDL_LoadBMP("environnement.bmp");
          SDL_BlitSurface(imageFond ,NULL , ecran , &position_imageFond);
          SDL_BlitSurface(sprite , NULL , ecran , &position_sprite);
          SDL_Flip(ecran);
          }


          Je regarde et j'édite.
          • Partager sur Facebook
          • Partager sur Twitter
          J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
            5 juin 2007 à 22:01:06

            L'explication est simple:

            La SDL ne reçoit qu'un événement à la fois.

            Soit flèche droite
            Soit flèche haut.

            Je vois 2 solutions possibles à ton problème

            1) Utiliser la touche CTRL (ou ALT ou MAJ) pour sauter puisqu'elle agit comme modificateur et pas comme évènement indépendant.

            OU

            2) Utiliser un tableau de booléen ou tu stockes les valeurs pour les touches. C'est-à-dire lorsque j'appuie sur "A", je mets le booléen de la case correspondant à "A" à true. et quand je lache "A" , je le remet à false (Il faut jouer avec les KEYDOWN et KEYUP).
            Puis dans la fonction ou tu fais avancer le sprite, tu viens lire le tableau, si les cases "fleche haut" et "fleche droite" sont à true, tu fais un saut vers la droite.

            A choisir entre les 2 solutions, je prendrai la 2ème, elle est plus générique et fonctionnera toujours.

            Nanoc

            • Partager sur Facebook
            • Partager sur Twitter
            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              6 juin 2007 à 11:30:05

              Citation

              2) Utiliser un tableau de booléen ou tu stockes les valeurs pour les touches. C'est-à-dire lorsque j'appuie sur "A", je mets le booléen de la case correspondant à "A" à true. et quand je lache "A" , je le remet à false (Il faut jouer avec les KEYDOWN et KEYUP).
              Puis dans la fonction ou tu fais avancer le sprite, tu viens lire le tableau, si les cases "fleche haut" et "fleche droite" sont à true, tu fais un saut vers la droite.


              Ton tableau de booléens, plutôt que de le gérer toi même comme tu proposes, autant laisser la SDL le faire (cf SDL_GetKeyState évoqué dans la faq).
              • Partager sur Facebook
              • Partager sur Twitter
              J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                6 juin 2007 à 12:03:02

                Oui en effet j'ai été voir la FAQ .
                Mais je sais pas si j'ai parfaitement compris :en faite j'utilise cette fonction(pas besoins de faire un SDL_PollEvent) , je le stock dans une variable de type int .
                Mais que donne le code?
                • Partager sur Facebook
                • Partager sur Twitter
                  6 juin 2007 à 13:36:43

                  ben...


                  /* Je vous passe le début de main */
                  while(continuer)
                  {
                      /* Uint8 est environ égal à unsigned int, c'est un type défini par la SDL. Le paramètre de cette fonction se laisse généralement à NULL, et elle retourne notre fameux tableau. */
                      Uint8 *touches = SDL_GetKeyState(NULL);

                      /* On n'a plus qu'a tester si telle où telle touche est enfoncée : */
                      if(touches[SDLK_q])
                          continuer = 0;

                      if(touches[SDLK_UP])
                          positionPerso.y--; //imaginaire...

                      if(touches[SDLK_RIGHT])
                          positionPerso.x++;
                  }

                  Qu'est ce que tu ne comprends pas avec cette méthode ?
                  Sinon, tu as quand même besoin d'un minimum de gestion des évènements, ne serait-ce que pour détecter les SDL_QUIT.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                    6 juin 2007 à 14:35:54

                    Y a plusieurs chose que je ne comprend pas :
                    -D'abord l'expression
                    <Uint8 *touches = SDL_GetKeyState(NULL);>
                    on ne pourrait pas mettre aussi <Uint8 touches[]>?
                    et que signifie le NULL? ou renvoie t-il?

                    -Ensuite dans le if : En effet le fonction renvoi un true ou false selon la touche pressée , mais pourquoi on ne doit pas mettre <if(touches[SDLK_q] == true)>?

                    Merci de ta réponse
                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 juin 2007 à 16:07:18

                      Citation

                      -D'abord l'expression
                      <Uint8 *touches = SDL_GetKeyState(NULL);>
                      on ne pourrait pas mettre aussi <Uint8 touches[]>?
                      et que signifie le NULL? ou renvoie t-il?


                      Effectivement, il est tout aussi correct de faire «touches[]». Ces deux formes sont strictement équivalentes.
                      Quand à NULL, je te l'avouerai, je ne sait pas à quoi correspond ce paramètre. C'est le paramètre qu'on envoie à la fonction. Avec NULL ça fonctionne, donc j'ai pas creusé, mais la doc t'en apprendra plus.

                      Citation

                      -Ensuite dans le if : En effet le fonction renvoi un true ou false selon la touche pressée , mais pourquoi on ne doit pas mettre <if(touches[SDLK_q] == true)>?


                      Parceque, de base, la SDL est codée en C. Et, en C, true et false n'existent pas. SDL utilise donc à la place un tableau d'entiers valant 0 ou 1.
                      Et, comme cette fonction est conçue comme ceci, on ne peut pas changer ça en booléens. Si c'est la forme

                      if (variable)

                      qui te gène, elle est équivalente à

                      if (variable != 0)

                      Voilà...
                      • Partager sur Facebook
                      • Partager sur Twitter
                      J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                        6 juin 2007 à 16:25:55

                        Merci maintenant je crois avoir compris je vais essayer .
                        Mais dernière question : j'ai bien le droit de mettre a l'intérieur du if "if(event.key.keysym.sym == SDLK_SPACE)"?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 juin 2007 à 20:52:03

                          Heu... oui, mais dans ce cas en plus du tableau il faut que tu aies un SDL_Event que tu mettes a jour avec SDL_PollEvent. A ta place je ferais


                          if(touches[SDLK_ESPACE]!=0)


                          Sinon c'est toujours possible de faire un mix des deux. Mais c'est pas forcément clair, attention.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                            7 juin 2007 à 11:27:50

                            Merci j'ai maintenant résolu le probleme...mais j'en ai un autre mnt :)

                            voici le code que j'ai poster a ce lien : http://rafb.net/p/BNhXzl68.html




                            erci de votre aide
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 juin 2007 à 11:31:58

                              est-ce que je pourrais avoir l'adresse msn de quelqu'un qui connait bien la SDL?pasque j'essaye de faire un jeu plateforme a la mario mais j'ai beaucoup trop de questions et je ne pourrais jamais toute les poster!

                              merci d'une réponse

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Probleme SDL et evenements

                              × 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