Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu, rotation, SDL

    29 août 2007 à 0:34:16

    bonjour voila je suis entraine de creer un jeux de voture un peu comme dans l'exemple du tuto sur la rotation avec SDL_gfx et voila j'ai beau ma creuser la tete je vois pas comment faite pour que ma voiture suive l'angle de rotation, je ne sait pas vraiment comment faire voici un bout de code

    int angle;
    SDL_Rect pos;

    //quand event.key.keysym.sym
    case SDLK_LEFT:
    angle++;
    break;

    case SDLK_RIGHT:
    angle--;
    break;

    et mon prbleme est que je je sait pas quoi mettre pour les tuche haut et bas car il faut que la voiture aille dans une diriection qui a un raport avec l'angle.
    • Partager sur Facebook
    • Partager sur Twitter
      29 août 2007 à 9:39:44

      Pour un angle a (exprimé en radian) :
      . x,y = coordonnée de ta voiture
      . d = distance a avancer

      x += d*cos(a);
      y += d*sin(a);

      Probleme de trigonométrie :)
      • Partager sur Facebook
      • Partager sur Twitter

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

        29 août 2007 à 11:35:12

        je n'arrive pas a obtenir les resultats que je veut voici mon code :

        1. 1.
        2.       void Car::aff(SDL_Surface *ecran)
        3.    2.
        4.       {
        5.    3.
        6.    4.
        7.          angleR = angle/(2*3.1415);
        8.    5.
        9.    6.
        10.          pos.x += cos(angleR) * vy;
        11.    7.
        12.          pos.y += sin(angleR) * vx;
        13.    8.
        14.    9.
        15.          voiture = rotozoomSurface(car, angle, 1.0, 1);
        16.   10.
        17.   11.
        18.          posV.x = pos.x - voiture->w/2;
        19.   12.
        20.          posV.y = pos.y - voiture->h/2;
        21.   13.
        22.   14.
        23.          SDL_FillRect(ecran, NULL, 0);
        24.   15.
        25.          SDL_BlitSurface(voiture, NULL, ecran, &posV);
        26.   16.
        27.          SDL_Flip(ecran);
        28.   17.
        29.       }
        30.   18.
        31.   19.
        32.       void Car::gereTouche(SDL_Event event)
        33.   20.
        34.       {
        35.   21.
        36.          if(event.type == SDL_KEYDOWN)
        37.   22.
        38.          {
        39.   23.
        40.              switch(event.key.keysym.sym)
        41.   24.
        42.              {
        43.   25.
        44.                  case SDLK_UP: vy = 10; break;
        45.   26.
        46.                  case SDLK_DOWN: vy = -10; break;
        47.   27.
        48.                  case SDLK_LEFT: vx = 10; angle++; break;
        49.   28.
        50.                  case SDLK_RIGHT: vx = 10; angle--; break;
        51.   29.
        52.              }
        53.   30.
        54.          }
        55.   31.
        56.          if(event.type == SDL_KEYUP)
        57.   32.
        58.          {
        59.   33.
        60.              switch(event.key.keysym.sym)
        61.   34.
        62.              {
        63.   35.
        64.                  case SDLK_UP: vy = 0; break;
        65.   36.
        66.                  case SDLK_DOWN: vy = 0; break;
        67.   37.
        68.                  case SDLK_LEFT: vx = 0; break;
        69.   38.
        70.                  case SDLK_RIGHT: vx = 0; break;
        71.   39.
        72.              }
        73.   40.
        74.          }
        75.   41.
        76.       }
        • Partager sur Facebook
        • Partager sur Twitter
          30 août 2007 à 12:41:14

          Personne n'a de reponces ???
          • Partager sur Facebook
          • Partager sur Twitter
            30 août 2007 à 12:48:37

            pos.x += cos(angleR) * vy;
            pos.y += sin(angleR) * vx;

            Pourquoi vx et vy ?
            tu te déplaces d'une distance euclidienne v (ou d) : elle représente le rayon d'un cercle si tu y représentes de façon trigo, c'est le meme v qu'il faut mettre dans les 2 lignes.

            pos.x += cos(angleR) * v;
            pos.y += sin(angleR) * v;

            Quel est ton niveau en trigo ? :)
            • Partager sur Facebook
            • Partager sur Twitter

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

              30 août 2007 à 14:39:18

              j'avait fait sa pour essayer vus que sa me marchait pas mais sa marche tjs pas
              1. void Car::aff(SDL_Surface *ecran)
              2. {
              3.     if(angle == 360 || angle == -360)
              4.     angle = 0;
              5.     angleR = angle * 3.1415 / 180;
              6.     pos.x += vy *cos(angleR);
              7.     pos.y += vy *sin(angleR);
              8.     voiture = rotozoomSurface(car, angle, 1.0, 1);
              9.     posV.x = pos.x - voiture->w/2;
              10.     posV.y = pos.y - voiture->h/2;
              11.     SDL_FillRect(ecran, NULL, 0);
              12.     SDL_BlitSurface(voiture, NULL, ecran, &posV);
              13.     SDL_Flip(ecran);
              14. }
              15. void Car::gereTouche(SDL_Event event)
              16. {
              17.     if(event.type == SDL_KEYDOWN)
              18.     {
              19.         switch(event.key.keysym.sym)
              20.         {
              21.             case SDLK_UP: vy = -10; break;
              22.             case SDLK_DOWN: vy = 10; break;
              23.             case SDLK_LEFT: angle++; break;
              24.             case SDLK_RIGHT: angle--; break;
              25.         }
              26.     }
              27.     if(event.type == SDL_KEYUP)
              28.     {
              29.         switch(event.key.keysym.sym)
              30.         {
              31.             case SDLK_UP: vy = 0; break;
              32.             case SDLK_DOWN: vy = 0; break;
              33.             case SDLK_LEFT: vx = 0; break;
              34.             case SDLK_RIGHT: vx = 0; break;
              35.         }
              36.     }
              37. }


              je pense que c'est la transformation de degré a radiant qui est fausse

              mon niveau est 2de et je passe en 1erS mais on a pas vu les radiant en seconde a cause de la prof elle s'etendait trop sur les cour et on a pas eu le temps


              j'ai deja je metait trompé en passent de degré a radaiant c'est angle *PI / 180
              et apres c'est
              1. pos.x += vy *sin(angleR);
              2.     pos.y += vy *cos(angleR);



              merci beaucoup de ton aide
              • Partager sur Facebook
              • Partager sur Twitter
                30 août 2007 à 14:52:24

                la formule pour les radians est pourtant bonne :)
                par contre, attention ! (je ne sais pas si l'erreur vient de la), mais ton angle en radian doit etre un flottant !! Pas un entier :)


                Dans un premier temps, pour rester, met une constante pour ton vy :

                par exemple :

                pos.x += 10 *cos(angleR);
                pos.y += 10 *sin(angleR);

                Juste pour tester dans un premier temps ! (car si ça se trouve, c'est ton vy qui varie, ou qui n'est pas bon !)

                • Partager sur Facebook
                • Partager sur Twitter

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

                  3 octobre 2007 à 22:39:01

                  Salut,

                  dis moi je sais pas si ton probleme est la mais moi j'ai un soucis avec la position de l'objet apres la rotation.

                  En effet comment fais tu pour initialiser : pos.x et pos.y

                  1. posV.x = pos.x - voiture->w/2;
                  2. posV.y = pos.y - voiture->h/2;


                  j'ai vu que tu transformais la valeur avec un angle en radian mais quelle valeur a tu au tout debut.

                  J'ai je pense le meme probleme que toi.
                  Si je bouge mon objet et que je passe en parrametre ma position et que j'effectue la transformation mon objet est deplacé du fait de la transfromation de mon objet lors de la rotation
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 octobre 2007 à 21:05:02

                    Bonjour, je ne sais pas si cela peut répondre a votre problème mais voici une fonction que j'ai codé qui permet de réaliser facilement des rotations:
                    1. #include <cstdlib>
                    2. #include <math.h>
                    3. coordonnes * rotation(coordonnes * centreDeRotation,coordonnes * base,double angle)//angle est en degrés
                    4. {
                    5.   coordonnes retour={
                    6. int(
                    7. cos (M_PI*angle/180)*(base->x-centreDeRotation->x)+(sin (M_PI*angle/180)*(-base->y+centreDeRotation->y))+centreDeRotation->x
                    8. ),
                    9. int(
                    10. cos (M_PI*angle/180)*(base->y-centreDeRotation->y)+(sin (M_PI*angle/180)*(base->x-centreDeRotation->x))+centreDeRotation->y
                    11. )};
                    12.   return &retour;
                    13. }


                    ici "base" est le positionnement de la voiture, et "coordonnes" une structure tel que:
                    1. struct coordonnes
                    2. {
                    3. int x;
                    4. int y;
                    5. };
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 octobre 2007 à 10:59:09

                      C'est mieux de travailler en double qu'en int.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Jeu, rotation, 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