IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Les animations en SDL et les FPS


Sujet :

SDL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut Les animations en SDL et les FPS
    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:
    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;
            }
        }
    }
    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).
    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à

    ++

  2. #2
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    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.
    Avant de te répondre plus en détail, je te dirais que tu ne te trompes pas

    Il est vrai que j'utilise le nombre de frame par seconde dans mes tutos actuels comme la vitesse d'affichage qui influence la vitesse de déplacement de mon personnage dans le tuto cité.

    Une meillleure façon de faire afin que la vitesse du personnage ne change pas en fonction du nombre de fps, serais ta solution par exemple.

    Je pense qu'une "correction" peut être ajouter à mon tuto, mais il faudrait commencer à la faire non pas dans la partie animation, mais dans la partie mouvements.

    Je suis assez content que tu ai repris un de mes tutos et retravaillé le code afin d'obtenir ce que tu voulais car ça fais parti de ce que je souhaite que vous fassiez avec

    Je vais prendre en compte tes remarques et faire des changements dès que j'aurais le temps de les faires (c'est noté au moins), je souhaiterais aussi si possible avoir ta source que je puisse la mettre et te citer car ce sont tes changements

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par loka
    Je souhaiterais aussi si possible avoir ta source que je puisse la mettre
    Les changements je les ai adaptés à mon projet et donc c'est pas trop exploitable, en revanche je vais reprendre l'exemple de ton tutoriel et ajouter les changements au propre, ca ne sera pas trop long et ca te permettra d'être plus clair de pas trop y passer de temps.
    Je t'enverrai cela sous peu de temps

    EDIT: C'est envoyé, va voir tes MPs.

  4. #4
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Points : 5 509
    Points
    5 509
    Par défaut
    Je te remercie

    Edit : je met à jour les tutos X et XII ce week end normalement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/09/2009, 10h02
  2. Réponses: 0
    Dernier message: 21/09/2009, 23h41
  3. SDL - Utiliser les Events sans video.
    Par AliceD dans le forum SDL
    Réponses: 6
    Dernier message: 20/07/2006, 17h32
  4. Afficher les objets et les anim sous maya
    Par Asmod_D dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 15/05/2006, 02h43
  5. Réponses: 6
    Dernier message: 30/06/2004, 08h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo