Bonjour,
Ce topic s'adresse principalement à Loka (et à tous les developpeur intéressés bien sur) par rapport à son tutoriel sur les animations:
> Tutoriel sur les animations en SDL
Je ne suis que débutant en SDL, mais j'ai trouvé une petite amélioration à apporter (enfin je pense).
La variable FRAMES_PER_SECOND contient le nombre d'image que l'on souhaite afficher par seconde. Or, comme son nom l'indique il s'agit que du nombre d'image à afficher, et normalement il ne doit pas agir sur le comportement du jeu lui même: si le FPS est elevé on a une grande fluidité, sinon un pauvre temps de rafraichissement.
Pour dire cela, je me base sur les FPS tel qu'il sont exprimé dans de nombreux jeux, par exemple aucun joueur de Counter-Strike n'ira me contredire: on peut paramétrer le nombre de FPS maximum pour assurer une meilleur fluidité (enfin de là à passer de 40 à 90 je n'ai jamais vu la différence, mais bon). Au final, le joueur ne cours pas plus vite !
Quoi qu'il en soit, dans le tutoriel si on modifie les FPS, on va modifier la vitesse du personnage. Or, quand dans mon fichier de configuration je vais entrer:
const float VIT_DEPL_PERSO = 100.0;
D'après mon sens logique, quand je parle de vitesse je parle en terme de pixel par unité de temps (pixel par seconde par exemple), et non pas pixel par frame comme dans le tutoriel.
Car si on change le FPS, la vitesse du personnage change !
Du coup, la constante est à changer également, pas très pratique pour les réglages.
Autre effet indésiré: la vitesse d'animations du personnage aussi change, et on ne peux pas la paramétrer, elle est directement lié au nombre de FPS.
Donc pour remedier à cela, quand je change le vecteur vitesse de mon personnage, je divise par le nombre de FPS pour retomber sur une vitesse en pixel par seconde:
Ensuite, pour faire en sorte que les animations soient paramétrables, j'ai ajouté un timer (nommé 'timer' par exemple) à ma class Personnage. Ce timer, je le démarre dans le constructeur par exemple (dans mon cas, je le démarre en réalité au passage de status IMMOBILE au statue de MARCHE mais cela fonctionne également).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 void Perso :: get_event(SDL_Event event) { if( event.type == SDL_KEYDOWN ) { switch( event.key.keysym.sym ) { case SDLK_UP: this->vit_y -= (VIT_DEPL_PERSO / FPS); break; case SDLK_DOWN: this->vit_y += (VIT_DEPL_PERSO / FPS); break; case SDLK_LEFT: this->vit_x -= (VIT_DEPL_PERSO / FPS); break; case SDLK_RIGHT: this->vit_x += (VIT_DEPL_PERSO / FPS); break; } } else if( event.type == SDL_KEYUP ) { switch( event.key.keysym.sym ) { case SDLK_UP: this->vit_y += (VIT_DEPL_PERSO / FPS); break; case SDLK_DOWN: this->vit_y -= (VIT_DEPL_PERSO / FPS); break; case SDLK_LEFT: this->vit_x += (VIT_DEPL_PERSO / FPS); break; case SDLK_RIGHT: this->vit_x -= (VIT_DEPL_PERSO / FPS); break; } } }
J'ai également définit deux constantes:
const float PERSO_DELAI_FRAME = 60.0; // délais entre deux frames (en ms)
const int PERSO_NB_ANIM = 3; // Nombre de frame d'animation
Lors du changement de frame, je regarde d'abord s'il est l'heure.
Les lignes du tutoriel d'incrément de frame:
frame++;
Deviennent alors:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 if( this->timer.get_ticks() >= PERSO_DELAI_FRAME ) { // On remet le timer à 0 this->timer.start(); // On passe à la frame suivante if( ++this->frame >= PERSO_NB_ANIM ) this->frame = 0; }
Conclusion
Une fois cela mis en place, je gère la vitesse du personnage avec une constante en Pixel par Seconde, la vitesse de son animation avec une constante en Ms et la fluidité de l'affichage avec une constante FPS en Image par Seconde qui influence la fluidité du jeu mais n'influence en rien la rapidité réelle du personnage.
Après peut-être que je me trompe sur toute la ligne, mais je trouve cela bien plus logique et utile à gérer dans le cas d'un jeu.
J'attends vos avis pour ceux qui ont eu le courage de lire jusqu'a là
++
Partager