Optimiser SDL

Optimiser SDL - C++ - Programmation

Marsh Posté le 30-08-2007 à 15:59:46    

bonjuour voial je trouve que la SDL ne fonctionne pas tres bien sur mon pc.
 
Je m'explique je viens de creer une fenetre avec une voiture qui se balade or quand je chage la dimention de la fenetre (je la met plus grande) la voiture va beaucoup moins vite pourtant c'est qu'un programme tres leger et mon ordi est assez puissant :
 
core 2 duo 6300;
6600GT;
1280mo 3200;
80go western digital;
windows xp;
 
je fait touner des jeux 3D avec de bon graphismes et c'est ce programme de rien fonctionne pas bien je comprend pas
 
est que je code comme un pied ou la SDL n'est pas optimisé pour mon pc ????

Reply

Marsh Posté le 30-08-2007 à 15:59:46   

Reply

Marsh Posté le 30-08-2007 à 16:57:41    

poste le code stp

Reply

Marsh Posté le 30-08-2007 à 17:01:16    

Define.h :

Code :
  1. #ifndef DEF
  2. #define DEF
  3.     #include <SDL/SDL.h>
  4.     #include <SDL/SDL_image.h>
  5.     #include <FMOD/FMOD.h>
  6.     #include <SDL/SDL_ttf.h>
  7.     #include <SDL/SDL_rotozoom.h>
  8.     #include <iostream>
  9.     #include "Car.h"
  10.     const int LARGEUR = 300;
  11.     const int HAUTEUR = 300;
  12. #endif


 
 
 
Car.h

Code :
  1. #ifndef CAR
  2. #define CAR
  3.     #include "define.h"
  4.     class Car
  5.     {
  6.         private:
  7.             int v;
  8.             float angle, angleR;
  9.             SDL_Surface *car, *voiture;
  10.             SDL_Rect pos, posV;
  11.         public:
  12.             Car();
  13.             ~Car();
  14.             void gereTouche(SDL_Event event);
  15.             bool init();
  16.             void aff(SDL_Surface *ecran);
  17.     };
  18. #endif


 
 
 
Car.cpp

Code :
  1. #include "Car.h"
  2. using namespace std;
  3. Car::Car()
  4. {
  5.     car = NULL;
  6.     voiture = NULL;
  7. }
  8. Car::~Car()
  9. {
  10.     SDL_FreeSurface(car);
  11.     SDL_FreeSurface(voiture);
  12. }
  13. bool Car::init()
  14. {
  15.     car = IMG_Load("data/voiture.png" );
  16.     pos.x = 100;
  17.     pos.y = 100;
  18.     v = 0;
  19.     angle = -90.0;
  20.     angleR = 0.0;
  21. }
  22. void Car::aff(SDL_Surface *ecran)
  23. {
  24.     angleR = (angle * M_PI) / 180.0f;
  25.     pos.x += v*sin(angleR);
  26.     pos.y += v*cos(angleR);
  27.     voiture = rotozoomSurface(car, angle, 1.0, 1);
  28.     posV.x = pos.x - voiture->w/2;
  29.     posV.y = pos.y - voiture->h/2;
  30.     SDL_FillRect(ecran, NULL, 0);
  31.     SDL_BlitSurface(voiture, NULL, ecran, &posV);
  32.     SDL_Flip(ecran);
  33. }
  34. void Car::gereTouche(SDL_Event event)
  35. {
  36.     if(event.type == SDL_KEYDOWN)
  37.     {
  38.         switch(event.key.keysym.sym)
  39.         {
  40.             case SDLK_UP: v = -6.0; break;
  41.             case SDLK_DOWN: v = 3.0; break;
  42.             case SDLK_LEFT:
  43.                 if(v !=0)
  44.                     angle+= 5;
  45.                 break;
  46.             case SDLK_RIGHT:
  47.                 if(v !=0)
  48.                     angle-= 5;
  49.                 break;
  50.             default:break;
  51.         }
  52.     }
  53.     if(event.type == SDL_KEYUP)
  54.     {
  55.         switch(event.key.keysym.sym)
  56.         {
  57.             case SDLK_UP: v = 0; break;
  58.             case SDLK_DOWN: v = 0; break;
  59.         }
  60.     }
  61. }


 
 
main.cpp

Code :
  1. #include "define.h"
  2. Car car;
  3. int main(int argc, char* argv[])
  4. {
  5.     SDL_Surface *ecran = NULL;
  6.     SDL_Init(SDL_INIT_VIDEO);
  7.     car.init();
  8.     ecran = SDL_SetVideoMode(LARGEUR, HAUTEUR, 32, SDL_HWSURFACE |SDL_DOUBLEBUF);
  9.     SDL_WM_SetCaption("Voiture v1.0", NULL);
  10.     SDL_WM_SetIcon(SDL_LoadBMP("data/sdl_icone.bmp" ), NULL);
  11.     bool continuer = true;
  12.     while(continuer)
  13.     {
  14.         SDL_Event event;
  15.         SDL_PollEvent(&event);
  16.         switch(event.type)
  17.         {
  18.             case SDL_QUIT:
  19.                 exit(0);
  20.                 break;
  21.             case SDL_KEYDOWN:
  22.                 car.gereTouche(event);
  23.                 break;
  24.             case SDL_KEYUP:
  25.                 car.gereTouche(event);
  26.                 break;
  27.         }
  28.         car.aff(ecran);
  29.     }
  30.     SDL_FreeSurface(ecran);
  31.     SDL_Quit();
  32.     return 0;
  33. }

Reply

Marsh Posté le 30-08-2007 à 22:12:53    

Salut !
 
   en fait ton problème viens de la manière dont tu déplace ta voiture : ce que tu fait c'est que tu incrémente la position de ta voiture en juste en ajoutant la vitesse (fois le ratio du cos / sin) et celà dans la boucle d'affichage. Le truc c'est que ta voiture a donc un mouvement fortement dépendant des FPS de ton programme : c'est a chaque frame que ta voiture va changer de place. Or si tu modifie la taille de ta fenêtre, tu vas inévitablement changer de nombre d'image affiché par seconde et donc de nombre de fois que tu incrémente la position de la voiture...
   Alors la solution serai que plutôt de faire une incrémentation constante (v*sin(angleR)) tu utilise un timer qui te permet de changer en fonction du temp qui s'est passé entre deux frames la valeur de l'incrémentation donc un truc du genre :

Code :
  1. pos.x += v*dt*sin(angleR);


avec "dt" qui vaut le temps qui s'est déroulé entre 2 frames et comme ça tu aurra le même mouvement quel que soit la machine qui le fait tourner et quel que soit la taille de la fenêtre ;)
 
(Et en plus ça fera plus vrai comme formule de calcul de position :D (homogénéité des formule et tout...) )

Reply

Marsh Posté le 30-08-2007 à 22:38:27    

oulaaaaaa je suis un tres simple debutant en programmation comment puige obtemier le temps entre 2 frame ?

Reply

Marsh Posté le 30-08-2007 à 22:54:35    

Tiens :
http://www.siteduzero.com/tuto-3-6 [...] #ss_part_3

 

Ca parle essentiellement d'OpenGL mais avec SDL.
Et si je me souviens bien la gestion de la vitesse d'anim est réalisée avec des fonctions fournies par SDL. Donc pas de soucis pour toi.

 

Pas de panique si ça parle d'OpenGL et de 3D, c'est exactement la même solution pour ton problème.

 

Et puis... Si je peux me permettre un conseil, évite de passer de suite à des calculs d'angles, ça fait mal aux yeux quand tu débute. Je sais de quoi je parle.

 

Edit :
Oui c'est bien réalisé avec une fonction SDL (SDL_GetTicks()) et deux trois calculs.
Je t'invite également à lire la partie suivante du tuto : Ne pas monopoliser le CPU


Message édité par dwogsi le 30-08-2007 à 23:00:43

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 30-08-2007 à 23:07:53    

:s le pire c'est que je l'ai deja lu mais je m'en servait pas pasque c'etait un peu plus compliqué


Message édité par marco565 le 30-08-2007 à 23:08:51
Reply

Marsh Posté le 30-08-2007 à 23:11:36    

C'est pas si compliqué que ça.
Bon ok ça demande quelques relectures aux débuts mais... si on veut faire faut apprend un jour ou l'autre.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 30-08-2007 à 23:18:58    

sa marche merci

Reply

Marsh Posté le 30-08-2007 à 23:20:40    

a une derniere chose quand je crée une fenetre en SDL elle s'afiche nimporte ou dans l'ecran existerais t'il une methode (comme celle pour l'opengl) pour pouvoir la metre a un endoir preci
 
 
merci d'avence

Reply

Marsh Posté le 30-08-2007 à 23:20:40   

Reply

Marsh Posté le 30-08-2007 à 23:25:58    

OpenGL, fenêtrage?
Va falloir détailler parce que là je vois pas de quoi tu parle.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 30-08-2007 à 23:28:00    

on laisse tomber opengl
 
je demande juste s'il ya une fonction qui permet de definir la position de la fenetre a l'ecran en SDL

Reply

Marsh Posté le 30-08-2007 à 23:38:12    

Pas que je sache non. A confirmer quand même.


---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
Reply

Marsh Posté le 30-08-2007 à 23:42:10    

pasque je refait la doc 10 fois et je trouve pas (enfin elle est en anglais aussi)

Reply

Marsh Posté le 31-08-2007 à 10:27:49    

bah au niveau interface graphique des os tu as toujours moyen de positionner/redimentionner la fenêtre.
 
ce serait étonnant que tu n'est pas l'abstraction de ça dans la SDL.

Reply

Marsh Posté le 05-09-2007 à 11:37:13    

pour bouger la fenêtre, une piste :  
http://www.gamedev.net/community/f [...] _id=328286


---------------
blog dessins + srtCleaner | Ricoh R6 | K20d | MK-wii 5112-3549-9484 | en phase de déblablatisation depuis le 26 avril 2002 | Belgian Connection
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed