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 :

saccades très bizarres


Sujet :

SDL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 117
    Points : 76
    Points
    76
    Par défaut saccades très bizarres
    bonsoir,

    le titre de mon topic peut vous paraître un peu idiot mais je ne savais pas quoi mettre d'autre pour mon problème^^, alors voilà je code un petit jeu style mario en C++ avec la SDL, quand je testais mes déplacements (gauche et droite) avec le WaitEvent et EnableKeyRepeat(10, 10), les déplacements étaient un peu rapides mais ça ne saccadais pas, mais bon je peux difficilement gérer un jeu du style mario avec un WaitEvent, je suis donc passé a PollEvent, et je fais le test suivant pour définir le nombre de fps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tempsActuel = SDL_GetTicks();
            if (tempsActuel - tempsPrecedent > 10)
            {
                tempsPrecedent = tempsActuel;
            }
            else
            {
                SDL_Delay(10 - (tempsActuel - tempsPrecedent));
            }
    seulement voilà, maintenant avec n'importe quel nombre de ms d'attente (10, 20, 30, 40, 50) ça saccade un peu (avec 10 ça se voit pas fort mais ça se voit quand même) et evidemment ça devient beaucoup trop rapide, mais ce qui est bizarre c'est que ça se passe environ tous les 10 pixels. a environ tous les 10 pixels on diraitqu'il fait un bon de 5 pixels vers l'avant tout a coup, alors ça donne l'impression d'une saccade et je ne sais pas comment le gérer. je pense que c'est parce que SDL_Delay n'est pas extrèmement précise, et donc peut mettre le programme en attente un peu plus longtement que prévu pour certaines boucles, mais je n'en suis pas sur et de toute façon je ne sais pas comment le règler (du moins sans faire un jeu qui dès qu'on appuye sur une touche envois le personnage a l'autre bout de l'écran). pourriez vous me donner votre avis ?

    merci

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Ne fais pas de pause dans l'affichage, et gère la vitesse de déplacement de ton personnage différemment.
    Il faut que tu stockes le fait que le joueur veut que son perso se déplace vers la gauche ou vers la droite. Puis dans ta boucle principale, si "tempsActuel - tempsPrecedent > [délai à déterminer]", tu déplaces réellement ton perso (tu modifies sa position)...

    De cette façon, l'affichage est fluide puisque tu ne le gèles pas, et tu peux gérer complètement la vitesse de ton perso.

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Voir ici comment gérer le taux de rafraîchissement à la main :
    http://jeux.developpez.com/faq/sdl/?...esse_affichage

    A savoir que je fais généralement :


    unsigned int checkTime = SDL_GetTicks();
    const unsigned int fps = 20;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if(SDL_GetTicks() > (checkTime + 1000 / fps) )
    {
        /* Code à exécuter 20 fois / seconde ... */
     
        /* On remet à jour le temps à contrôler */
        checkTime = SDL_GetTicks();
    }
    else
    {
     //Laisser dormir le programme
     SDL_Delay(5);
    }
    Sinon, il faut regarder la bibliothèque SDL_gfx avec le fichier d'en-tête SDL_framerate.

    Par contre, tu dis que ton mouvement est trop rapide. Cela laisse entendre que ton mouvement et ton jeu est en fonction du taux de rafraîchissement. C'est une mauvaise idée. Pratique dans un premier temps je te l'accorde mais très mauvais.

    Gére tes mouvements en fonction du temps...

    Jc

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 117
    Points : 76
    Points
    76
    Par défaut
    merci pour vos réponses^^, en effet je n'avais pas penser de gérer le déplacement en fonction du temps, en fait ce que je fais c'est déplacer le personnage de un pixel a chaque boucle faut dire que jsuis pas un expert c'est la 1ère fois que je fais un jeu

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

Discussions similaires

  1. Valeurs de clés négatives très bizarres ...
    Par Christophe Charron dans le forum Requêtes
    Réponses: 15
    Dernier message: 30/03/2006, 10h42
  2. [JDBC] Erreur très bizarre dans ExecuteQuery
    Par boudou dans le forum JDBC
    Réponses: 6
    Dernier message: 17/03/2006, 18h33
  3. différence reload et location + pb très bizarre pour experts
    Par grinder59 dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 09/01/2006, 12h05
  4. Problème très bizarre avec COUNT
    Par Nomade95000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/10/2005, 14h12
  5. Réponses: 4
    Dernier message: 28/09/2002, 00h00

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