Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1377 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Optimiser SDL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Optimiser SDL

n°1606360
marco565
Posté le 30-08-2007 à 15:59:46  profilanswer
 

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 ????

mood
Publicité
Posté le 30-08-2007 à 15:59:46  profilanswer
 

n°1606418
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 30-08-2007 à 16:57:41  profilanswer
 

poste le code stp

n°1606424
marco565
Posté le 30-08-2007 à 17:01:16  profilanswer
 

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. }

n°1606551
Amonchakai
Posté le 30-08-2007 à 22:12:53  profilanswer
 

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...) )

n°1606560
marco565
Posté le 30-08-2007 à 22:38:27  profilanswer
 

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

n°1606570
dwogsi
Défaillance cérébrale...
Posté le 30-08-2007 à 22:54:35  profilanswer
 

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})/
n°1606579
marco565
Posté le 30-08-2007 à 23:07:53  profilanswer
 

: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
n°1606581
dwogsi
Défaillance cérébrale...
Posté le 30-08-2007 à 23:11:36  profilanswer
 

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})/
n°1606584
marco565
Posté le 30-08-2007 à 23:18:58  profilanswer
 

sa marche merci

n°1606586
marco565
Posté le 30-08-2007 à 23:20:40  profilanswer
 

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

mood
Publicité
Posté le 30-08-2007 à 23:20:40  profilanswer
 

n°1606587
dwogsi
Défaillance cérébrale...
Posté le 30-08-2007 à 23:25:58  profilanswer
 

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})/
n°1606588
marco565
Posté le 30-08-2007 à 23:28:00  profilanswer
 

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

n°1606590
dwogsi
Défaillance cérébrale...
Posté le 30-08-2007 à 23:38:12  profilanswer
 

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})/
n°1606591
marco565
Posté le 30-08-2007 à 23:42:10  profilanswer
 

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

n°1606679
bjone
Insert booze to continue
Posté le 31-08-2007 à 10:27:49  profilanswer
 

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.

n°1608427
sisicaivra​i
Life is Beautifullll
Posté le 05-09-2007 à 11:37:13  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Optimiser SDL

 

Sujets relatifs
Aide pour jeu de voiture en c++ avec SDLSDL:Savoir où on clique
Comment Optimiser l'execution du code avec GCC ??[Résolu][C] problème de link SDL, SDL_image, SDL_ttf sous cygwin
[SDL] gestion d'evenement hor de la fenetre ?[SDL] Erreur de compilation sous Windows
Erreur SDLProjet C++/SDL
Projet C++ : RPG 2D (Librairie SDL)[SDL] gros soucis :(
Plus de sujets relatifs à : Optimiser SDL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR