Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le temps et les évenements SDL

    9 juillet 2006 à 12:21:56

    Bonjour !!

    Voilà en ce moment je me suis mis en tête de faire un snake. Mais avant tout je me suis lancé dans quelque test pour pas foncer tête baissé et me prendre un mur :p . Mais là je bloque sur un problème que je n'arrive pas à résoudre. Je voudrais faire bouger Zozor avec la gestion du temps mais de façcon à ceux que dis que j'appuie sur la touche gauche il bouge à gauche sans que je reste appuiyer dessus (donc comme un snake ;) ).

    Je ne vous demande pas de me donner le code, mais juste de me donner l'idée.
    • Partager sur Facebook
    • Partager sur Twitter
      9 juillet 2006 à 12:31:44

      Tu peux faire une énumération pour la direction:
      enum {GAUCHE, DROITE, HAUT, BAS};

      Tu fais une variable direction et si tu appuyes par exemple sur la touche gauche, direction = GAUCHE etc...

      Et tu fais bouger Zozor en fonction de ça.
      switch (direction)
      {
          case GAUCHE:
              // Zozor se déplace vers la gauche
              break;

          case DROITE:
              // Zozor se déplace vers la droite
              break;

          case HAUT:
              // Zozor se déplace vers le haut
              break;

          case BAS:
              // Zozor se déplace vers le bas
              break;
      }
      • Partager sur Facebook
      • Partager sur Twitter
        9 juillet 2006 à 12:36:52

        Bon bah j'ai essayé mais apperemment ca marche pas, je me demande si il ne faudrait pas que je fasse un boucle de façcon à ce que zozor s'arrête de bouger ou change de direction que lorsque que j'aurais appuyé sur une autre touche, mais je en vois pas comment organisé ça :euh:
        • Partager sur Facebook
        • Partager sur Twitter
          10 juillet 2006 à 12:19:23

          J'ai essayé de fair une boucle mais ca ne marche pas, ça me met zozor directement à l'autre bout de la fenêtre: voici le code que j'ai utiliser en dernier (car j'en ai essayé plein d'autre ;) )
                          case SDL_KEYDOWN:
                                  switch(event.key.keysym.sym)
                                  {
                                  case SDLK_RIGHT:

                                          direction = DROITE;
                                         
                                          switch(direction)
                                          {
                                          case DROITE:

                                                  // Boucle pour bouger zozor
                                                  for(positionZozor.x = ecran->w / 2 - zozor->w / 2; positionZozor.x < 600; positionZozor.x++)
                                                  {
                                                          positionZozor.x++;
                                                  }
                                                                                         
                                                                                                
                                                  // Sort de case DROITE
                                                  break;
                                                                         
                                          }
                                          break;

          • Partager sur Facebook
          • Partager sur Twitter
            10 juillet 2006 à 12:34:39

            Déjà tu n'as pas besoin de mettre positionZozor.x++; dans la boucle puisqu'il est déjà en paramètre de for.

            Et puis il suffit de rajouter un SDL_Delay.
            for(positionZozor.x = ecran->w / 2 - zozor->w / 2; positionZozor.x < 600; positionZozor.x++)
                SDL_Delay(10);

            Avec ce code, Zozor bougera d'un pixel vers la droite toutes les 10 milisecondes.

            Mais ton switch(direction) n'a pas vraiment sa place là.
            Il faudrait plutôt faire comme ceci:
            switch(continuer)
            {
                SDL_PollEvent(&event);

                switch(event.type)
                {
                   case SDL_KEYDOWN:
                       switch(event.key.keysym.sym)
                       {
                           case SDLK_RIGHT:
                               direction = DROITE;
                               break;

                           case SDLK_LEFT:
                               direction = GAUCHE;
                               break;

                           case SDLK_UP:
                               direction = HAUT;
                               break;

                           case SDLK_DOWN:
                               direction = BAS;
                               break;
                       }
                       break;
                }

                switch(direction)
                {
                    case DROITE:
                        if(positionZozor.x + 1 < LARGEUR_DE_LA_FENETRE)
                            positionZozor.x++;

                        else
                            direction = GAUCHE;
                        break;

                    case GAUCHE:
                        if(positionZozor.x - 1 > 0)
                            positionZozor.x--;

                        else
                            direction = DROITE;
                        break;

                    case HAUT:
                        if(positionZozor.y - 1 > 0)
                            positionZozor.y--;

                        else
                            direction = BAS;
                        break;

                    case BAS:
                        if(positionZozor.y + 1 < HAUTEUR_DE_LA_FENETRE)
                            positionZozor.y++;

                        else
                            direction = HAUT;
                        break;
                }

                SDL_Delay(10);

                // Blit des surfaces
            }
            • Partager sur Facebook
            • Partager sur Twitter
              10 juillet 2006 à 12:40:28

              A ta place j'utiliserais un vecteur vitesse, comme ça :
              /* appuis sur un touche */
              switch(event.key.keysym.sym)
              {
                  case SDLK_LEFT:
                      vVitesse.x =-1.0;
                      break;
                  case SDLK_RIGHT:
                      vVitesse.x = 1.0;
                      break;
                  case SDLK_UP:
                      vVitesse.y = -1.0;
                      break;
                  case SDLK_DOWN:
                      vVitesse.y = 1.0;
                      break;
              }

              /* relachement d'une touche */
              switch(event.key.keysym.sym)
              {
                  case SDLK_LEFT:
                  case SDLK_RIGHT:
                      vVitesse.x = 0.0;
                      break;
                  case SDLK_UP:
                  case SDLK_DOWN:
                      vVitesse.y = 0.0;
              }

              /* ... */
              const double VITESSE_DEPLACEMENT = 20.0; /* pixels par seconde */
              double dLastFrame = SDL_GetTicks()/1000.0;

              /* ... */
              vPosition += vVitesse * ((SDL_GetTicks()/1000.0) - dLastFrame) * VITESSE_DEPLACEMENT;
              dLastFrame = SDL_GetTicks()/1000.0;
              • Partager sur Facebook
              • Partager sur Twitter
                10 juillet 2006 à 12:58:46

                Merci ca marche :D . J'ai fait une fonction pour que ça soir plus clair. Bien penser pour le vecteur de vitesse.
                • Partager sur Facebook
                • Partager sur Twitter

                Le temps et les évenements SDL

                × 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