Pb Rotation

cs_jeremy0189 Messages postés 4 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 24 février 2008 - 22 févr. 2008 à 15:09
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 25 févr. 2008 à 17:11
Bjr tout le monde,je doit rendre ma pPTI pour mercredi prochain mais je suis un debutant en sdl et j'ai donc un probleme, voici mn code que le main.cpp(ci-dessous), je voudrais faire deplacer ma voiture avec rotation grace aux fleches du clavier mais je n'y arrive pas, le code ou sa bloke est en rouge je c il doit manquer 5 à 10 ligne mais impossible à trouver j'ai tout essayer mais la voiture fait n'importe quoi ...Quelqu'un pourrait t-il maider en me donnant le code necessaire ? Je vous en remercie d'avance.. 


<hr />
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_rotozoom.h>
#include "Implementation.h"#define TEMPS      15 // Le temps qu'il y a entre chaque augmentation de l'angle.

int main(int argc, char *argv[])
{
  SDL_Surface *ecran = NULL;

  SDL_Surface *rotation = NULL;
  SDL_Surface *message = NULL;
  SDL_Surface *background = NULL;
  SDL_Surface *tabvoit[3];
  SDL_Event event;
  SDL_Surface *perso = NULL;
  SDL_Rect positfond;
  SDL_Rect voitfond;
  SDL_Rect persofond;
  SDL_GetTicks();

// Position des images
positfond.x=0;positfond.y=0;
voitfond.x=310;voitfond.y=210;
persofond.x=220;persofond.y=251;

  const int SCREEN_WIDTH = 640;
  const int SCREEN_HEIGHT = 480;
  const int SCREEN_BPP = 32;

  int continuer = 1;

  int pointx;
  int pointy;
  double dpointx, dpointy;

  double angle = 0;
  double zoom = 1;
  int sens = 1;

  //Initialisation de la librairie SDL en mode vidéo uniquement et son
  SDL_Init (SDL_INIT_VIDEO);

  // Je définie une fenêtre de 640*480 en 32 bits
  ecran = SDL_SetVideoMode(792, 582, 32, SDL_SWSURFACE| SDL_DOUBLEBUF);
  // Je nomme ma fenêtre
  SDL_WM_SetCaption("Mini-Circuit", NULL);

 //Chargement de l'image
 background = SDL_LoadBMP("Circuit.bmp");

 perso = SDL_LoadBMP("perso2.bmp");

 //Tableau Voiture
 tabvoit[0]=SDL_LoadBMP("car1.bmp");
 tabvoit[2]=SDL_LoadBMP("car2.bmp");
 tabvoit[1]=SDL_LoadBMP("car3.bmp");

  while (continuer) /* TANT QUE la variable ne vaut pas 0 */
   {
        SDL_PollEvent(&event);
        switch(event.type) /* On teste le type d'évènement */
        {
            case SDL_QUIT: /* Si c'est un évènement QUITTER */
                 continuer = 0; /* On met le booléen à 0, donc la boucle va s'arrêter */
                 break;
          case SDL_KEYDOWN:
             switch (event.key.keysym.sym)
               {
                 case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                     continuer = 0;
                     break;

       /*         // touche pour deplacer la voiture
             case SDLK_UP:
                       double angle=angle*(3.1415/180.0);
        dpointx+=10*cos(angle);
        dpointy+=10*sin(angle);

               //permet la conversion d'un double en int
                       pointx=(int)dpointx;
        pointy=(int)dpointy;
           voitfond.x=pointx;
        voitfond.y=pointy;
       break;
        */

                 }
             }

 animperso(persofond);

//ContourImage ( voitfond);
  if(voitfond.y>=535)
     {
   voitfond.y=532;
  }
     if(voitfond.x>=754)
     {
   voitfond.x=752;
  }

 //Mur invisible  en dessous personnages
  if ((voitfond.y>=230)&&(voitfond.y<=270))

     if ((voitfond.x>=200)&&(voitfond.x<=250))
    {
     voitfond.y=290;
    }

     // Efface l'écran avec la couleur noire
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));

  // circuit devant l'ecran noir
        SDL_BlitSurface(background,NULL,ecran,&positfond);

  //Afficher Personnage et enleve les couleur contour
  SDL_BlitSurface(perso,NULL,ecran,&persofond);
  SDL_SetColorKey(perso,SDL_SRCCOLORKEY,SDL_MapRGB(perso->format,94,66,41));

  //On affiche la rotation de la surface image.
  SDL_SetColorKey(tabvoit[0],SDL_SRCCOLORKEY,SDL_MapRGB(tabvoit[0]->format,94,66,41));
     rotation = rotozoomSurface(tabvoit[0], angle, 1.0, 1);
     SDL_SetColorKey(rotation,SDL_SRCCOLORKEY,SDL_MapRGB(rotation->format,0,0,0));
        SDL_BlitSurface(rotation , NULL, ecran, &voitfond);

     //On efface rotation car on va la redéfinir dans la prochaine boucle.Si on ne le fait pas, cela crée une fuite de mémoire.
     SDL_FreeSurface(rotation);

  // Met l'écran en premier plan
        SDL_Flip(ecran);
    }

    SDL_FreeSurface(ecran);

  // Libération de la librairie SDL
  SDL_Quit();
  return EXIT_SUCCESS;
}

<hr /> 

6 réponses

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
22 févr. 2008 à 17:13
Deja il a des trucs bizarres et inutiles, pourquoi tu definis 2 variable qui ont pour nom "angle" ? Y'a forcement un moment ou l'une "prend le dessus" sur l'autre.
Essaye plutot
        double angle2=angle*(3.1415/180.0);
        dpointx+=10*cos(angle2);
        dpointy+=10*sin(angle2);

Si dpointx et dpointy sont les coordonnées de ton perso a quoi servent pointx et pointy surtout que d'apres ce que je voit seul voitfond.x et voitfond.y servent.
0
cs_jeremy0189 Messages postés 4 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 24 février 2008
22 févr. 2008 à 17:54
Merci pour ton aide, voila donc se que j'ai fais mais sa ne marche toujours pas. la direction se fait bien en bas, a gauche, a droite mais pas en haut et aucune rotation n'est effectué dans n'importe quel sens la voiture reste droite... Est ce que la partie en jaune  est encore utile ? Et que dois-je donc faire pour que cela fonctionne..... Merci pour tn aide...


<hr />

  // touche pour deplacer la voiture
                case SDLK_UP:
                       double angle2=angle*(3.1415/180.0);
                       dpointx+=10*cos(angle2);
                       dpointy+=10*sin(angle2);
                        break;                case SDLK_DOWN:
                       voitfond.y = voitfond.y+14;
                         break;
               case SDLK_LEFT:
                        voitfond.x= voitfond.x-14;
                         break;
                case SDLK_RIGHT:
                         voitfond.x = voitfond.x+14;
                         break;

//permet la conversion d'un double en int
       /*             pointx=(int)dpointx;
                       pointy=(int)dpointy;
                       voitfond.x=pointx;
                       voitfond.y=pointy;
                       break;
      */
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
23 févr. 2008 à 16:19
Ben en fait je comprend pas trop ton programme  SDLK_LEFT, SDLK_RIGHT ne servent pas a faire tourner ton vehicule justement ? Tu ne veut pas faire tourner ton vehicule avec droite et gauche ? et avancer avec SDLK_UP ?
Pourquoi fait tu bouger le fond quand la personne appuis sur droite et gauche ?

Sinon voitfond.y = (int)dpointy; dponitc doit rester en double car les valeurs sont a virgule.
0
cs_jeremy0189 Messages postés 4 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 24 février 2008
24 févr. 2008 à 13:08
Bin normalement SDLK_LEFT et RIGHT servent à tourner  et UP a avancer.. Mais sinon je fait pas tourner le fond "voitfond" c l'image de la voiture au dessus du fond est je voudrais donc la faire tourner avc rotation "fonction rotozoom" par rapport a un angle " la  trigonometrie" je pence que sa s'appelle comme sa mais je n'y arrive pas moi j'ai mis la formule dans SDLK_UP mais elle ne s'applique pas et je sais pas si cela est bon..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jeremy0189 Messages postés 4 Date d'inscription jeudi 21 février 2008 Statut Membre Dernière intervention 24 février 2008
24 févr. 2008 à 13:27
Sinn regarde il y a un exemple sur ce lien :
http://defaut.developpez.com/tutoriel/flash/mouvVoiture/
La c'est sur Flash Mx mais Je voudrais pouvoir faire le meme deplacement avc ma voiture sur mon programme seulement cela et sa serait genial ! ! lol
Merci pour tes coups de mains...
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
25 févr. 2008 à 17:11
C'est normal quelle reste fixe, a quel endroit dans ton prog tu fais varier l'angle de ta voiture ?
Quand on appuis sur avancer, on ne modifit pas l'angle mais on augmente la valeur x et y en fonction de l'angle.
Quand on appuuis sur droite ou gauche ON NE DEPLACE PAS LE VEHICULE (on ne touche pas a x ou y, il suffit de regarder un jeu qui marche avec ce systeme pour s'en apercevoir) mais on incremente ou decremente l'angle.

Apres tu n'as pas besoin de grosses connaissance en math pour faire juste tourner ton vehicule, regarde juste la definition de sinus et cosinus sur un cours de math c'est mieux expliqué que sur ton lien, (et d'ailleur pourquoi travailler en degré alors que tu convertis en radian, travaille directement avec des radians degré 0> 360 radian 0 > 2*Pi avec ca tu pourras meme virer la ligne
Double angle2=angle*(3.1415/180.0);Tu as juste a comprendre pourquoi y sin(angle) et x cos(angle)
0
Rejoignez-nous