Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Un va et vient

Qui ne marche pas

    7 octobre 2007 à 16:59:36

    Bonjour,

    Après une longue période d'absence me revoilà, et cette fois-ci j'ai un petit problème au niveau de l'animation d'un de mes personnages.

    Ce que je souhaites faire:
    Un personnage se déplace sur l'axe x tant qu'il n'a pas dépassé une limite si cette limite est déplacé il repart dans l'autre sens jusqu'à une nouvelle limite, et ainsi de suite.
    Shéma (| = limite, - = trajet, <> = direction, [] = perso):
    1. |---<---[]
    2. quand |[]---<----
    3. alors |[]--->---
    4. et quand --->---[]|
    5. alors ---<---[]|


    C'est le même système pour les anciens mario sur GB :)

    Mais bon voilà mon code à moi faire ça:
    Le perso se déplace vers la gauche sans problème et dès qu'il est à la limite il revient au point de départ et continue ainsi de suite. En gros il oublie de faire le chemin inverse en se téléportant directement :p

    Voici mon code (j'ai pas tout mis évidemment, car mettre 3 pages, les sprites and co, a embrouiller: ça vient de l'algo et pas d'ailleurs):

    1. while(continuer)
    2.     {
    3.         tempsActuel = SDL_GetTicks();
    4.         if(tempsActuel - tempsAvant > 100)
    5.         {
    6.             if(positionPikachu.x <= 100)
    7.             {
    8.                 while(positionPikachu.x <= 200)
    9.                 positionPikachu.x += 3;
    10.             }
    11.             else
    12.             positionPikachu.x -= 3;
    13.             tempsAvant = tempsActuel;
    14.         }
    15. //...
    16. SDL_PollEvent(&event); // évidemment


    Merci de m'apporter un peu de lumière :)
    • Partager sur Facebook
    • Partager sur Twitter
      7 octobre 2007 à 18:02:48

      Citation :

      ça vient de l'algo et pas d'ailleurs


      On est d'accord, mais tu ne comprends pas pourquoi ton bonhomme agit comme ça avec cet algo ?
      -> On entre dans la boucle avec positionPikachu.x surement < 100 non ?
      Alors la première condition est satisfaite => à la fin du premier tour (de la boucle générale), positionPikachu.x > 200. Ok ?
      -> Deuxième tour : La condition n'est pas satisfaite, l'instruction du else est éxécutée => Pikachu revient au départ.

      Pour ce type d'animation, ne pas négliger l'outils mathématiques, les fonctions trigonométriques sont pratiques avec les évènements périodiques.
      Mais dans un premier temps, je te conseil de t'en passer afin de trouver une solution purement algorithmique.
      • Partager sur Facebook
      • Partager sur Twitter
        7 octobre 2007 à 18:05:30

        A chaque incrémentation de pos.x tu ne "blit" pas ta surface et ne "flip" pas l'écran, donc c'est normal que tu ne voies rien...
        • Partager sur Facebook
        • Partager sur Twitter
          7 octobre 2007 à 18:11:19

          Citation : Caribou87

          A chaque incrémentation de pos.x tu ne "blit" pas ta surface et ne "flip" pas l'écran, donc c'est normal que tu ne voies rien...



          Non c'est fait plus bas, je vois le pikachu se déplacer donc.


          Citation : freecircus

          Citation :

          ça vient de l'algo et pas d'ailleurs


          On est d'accord, mais tu ne comprends pas pourquoi ton bonhomme agit comme ça avec cet algo ?
          -> On entre dans la boucle avec positionPikachu.x surement < 100 non ?
          Alors la première condition est satisfaite => à la fin du premier tour (de la boucle générale), positionPikachu.x > 200. Ok ?
          -> Deuxième tour : La condition n'est pas satisfaite, l'instruction du else est éxécutée => Pikachu revient au départ.

          Pour ce type d'animation, ne pas négliger l'outils mathématiques, les fonctions trigonométriques sont pratiques avec les évènements périodiques.
          Mais dans un premier temps, je te conseil de t'en passer afin de trouver une solution purement algorithmique.



          1. tempsActuel = SDL_GetTicks();
          2.         if(tempsActuel - tempsAvant > 100)
          3.         {
          4.             if(positionPikachu.x <= 100)
          5.             {
          6.                 while(positionPikachu.x <= 200)
          7.                 positionPikachu.x += 3;
          8.             }
          9.             else
          10.             {
          11.             while(positionPikachu.x >= 100)
          12.             positionPikachu.x -= 3;
          13.             }
          14.             tempsAvant = tempsActuel;
          15.         }


          Jme trompe? En tout cas ça me semble un peu plus logique :p
          Mais là le pikachu va à la vitesse de l'éclair, une fois à gauche puis au centre, à droite et au milieu etc etc..

          :/

          Edit: j'ai tenté autrechose mais sans succès (pikachu bouge pas)
          1. tempsActuel = SDL_GetTicks();
          2.             if(positionPikachu.x <= 100)
          3.             {
          4.                 while(positionPikachu.x <= 300)
          5.                 {
          6.                     if(tempsActuel - tempsAvant > 100)
          7.                     {
          8.                         positionPikachu.x += 3;
          9.                         tempsAvant = tempsActuel;
          10.                     }
          11.                 }
          12.             }
          13.             else
          14.             {
          15.             while(positionPikachu.x >= 300)
          16.                 {
          17.                     if(tempsActuel - tempsAvant > 100)
          18.                     {
          19.                         positionPikachu.x -= 3;
          20.                         tempsAvant = tempsActuel;
          21.                     }
          22.                 }
          23.             }
          • Partager sur Facebook
          • Partager sur Twitter
            7 octobre 2007 à 23:29:47

            bon ... si j'ai bien compris le probleme ta une surface que tu veut faire bouger entre deduxx limites, d'avant en arriere ?

            un indice :
            uilise une variable, que tu ajoutes aux coordonees x de ton perso.

            essaie de voir comment tu peut faire avec ca ... pour que ca marche ...
            • Partager sur Facebook
            • Partager sur Twitter
              7 octobre 2007 à 23:36:42

              Il faut raisonner en structures, en objet :
              Par exemple définir ton objet ainsi :

              1. struct objet
              2. {
              3.   int x,y;   // coordonnées
              4.   int vx,vy;   // vecteur de déplacement
              5.  ...
              6. }


              Au début, tu met vx=1, et quand tu as x>300, tu mets vx=-1. et quand tu as x<10 tu remets vx=1

              et ensuite, a chaque itération, tu fais x+=vx;

              et ton va et vient marche bien.

              n'oubliez pas qu'il est important, pour chaque "objet" si j'ose dire, de stocker tout ce qui le caractérise, de façon a ce que, quand tu demande "Evolue", l'objet contienne ses données suffisantes pour évoluer tout seul : dans ce cas, l'objet contient vx, il sait vers ou il va évoluer.
              • Partager sur Facebook
              • Partager sur Twitter

              Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                8 octobre 2007 à 1:59:39

                ben c'est malin ... j'essaie de trouver un moyen de le faire reflechir et tu lui donnes la reponse -_-'
                • Partager sur Facebook
                • Partager sur Twitter

                [SDL] Un va et vient

                × 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