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 :

Problemes de fluidité


Sujet :

SDL

  1. #1
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut Problemes de fluidité
    Mon projet consiste en une reprise de CS2D et j'ais pensé , pour garder le joueur au centre de la fenetre , de blitter sa représentation au centre de la fenetre.En gros , j'ais

    SDL_Rect posPlayer;
    posPlayer.x = 320;
    posPlayer.y = 240;

    Ensuite , lorsque le joueur appuye sur la fleche de gauche , tout le décor bouge de 5 pixels vers la droite ( un peu a la mario ).
    Seulement lorsque je désire faire bouger de grandes surfaces avec cette technique , ça n'a pas un effet fluide ( effet sacadé ) ... Existe t'il un moyen pour simuler un mouvement autre que le déplacement 5 pxl par 5 pxl brut ?

  2. #2
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par ironzorg
    Mon projet consiste en une reprise de CS2D et j'ais pensé , pour garder le joueur au centre de la fenetre , de blitter sa représentation au centre de la fenetre.En gros , j'ais

    SDL_Rect posPlayer;
    posPlayer.x = 320;
    posPlayer.y = 240;

    Ensuite , lorsque le joueur appuye sur la fleche de gauche , tout le décor bouge de 5 pixels vers la droite ( un peu a la mario ).
    Seulement lorsque je désire faire bouger de grandes surfaces avec cette technique , ça n'a pas un effet fluide ( effet sacadé ) ... Existe t'il un moyen pour simuler un mouvement autre que le déplacement 5 pxl par 5 pxl brut ?
    Un code minimal exposant le problème serait pas mal. Il existe plusieurs techniques pour les Mario-like.

    Mais aujourd'hui, les ordinateurs sont capables de les faire tourner correctement sans trop se prendre la tête...
    Jc

  3. #3
    Membre émérite
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Par défaut
    Il faut activer le doublebuffer je crois

  4. #4
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    Désolé pour le retard ... ( problemes de LiveBox )

    En fait j'utilise la technique basique pour le mouvement d'une surface , à savoir le mouvement pixel par pixel :
    posPerso.x++;
    J'ais trouvé au début que cette méthode était trop lente pour déplacer le perso , car il fallait que celui ci se déplace plus vite. Je suis donc passé à :
    posPerso.x = posPerso.x+5;
    Mais là , le mouvement du perso est très saccadé : le programme détecte la pression d'une flèche directionnelle , bouge le perso de 5 pixel et attend que le joueur réappuie sur une autre touche. Seulement lorsque le joueur appuie de manière prolongée sur les flèches directionnelles , l'image du perso a un mouvement saccadé...

    PS : le double buffer est activé

  5. #5
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Citation Envoyé par ironzorg
    Mais là , le mouvement du perso est très saccadé : le programme détecte la pression d'une flèche directionnelle , bouge le perso de 5 pixel et attend que le joueur réappuie sur une autre touche. Seulement lorsque le joueur appuie de manière prolongée sur les flèches directionnelles , l'image du perso a un mouvement saccadé...
    Le problème vient peut-être de la gestion des évennements. Cette méthode ne me semble à conseiller que quand les déplacements se font par cases et où une pression entraine un déplacement d'une unité. Pour un déplacement continu tout dépend de la répétition automatique de la touche et c'est moyen.

    Il faudrait plutôt qu'appuyer sur la touche fasse passer le personnage en mode "marcher dans la direction X" et que la relacher le remette sur neutre... et c'est tout. La modification de la position se fait en fonction de l'état du personnage lors de la mise à jour du jeu à chaque image ou à intervale de temps fixe (la deuxième solution ayant l'avantage de s'affranchir du taux de rafraichissement de la partie graphique). Avec ça, faire plus +1 pixel à chaque image ou +5 devrait donner une animation fluide (plus lente mais plus souple dans le premier cas).

  6. #6
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    OK je vois ... Mais je ne suis pas sur de comprendre "en fonction de l'état du personnage lors de la mise à jour du jeu" . Tu veux dire que par exemple, si l'image représentant le player est dirigée vers la droite et que le joueur appuie sur la flèche de droite , alors on appelle la fonction qui fait se déplacer le joueur vers la droite de x pixels vers la droite jusqu'a ce que la touche soit relachée ...

  7. #7
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Note après rédaction :
    En fait je conseille la faq SDL, et tout particulièrement la section clavier, qui a l'avantage de donner du vrai code et de rendre mon monologue inutile (double )


    Il y a (je dirais comme toujours) plusieurs façon de gérer les évennements. Celle que je sous-entendais, et qui ne me semble avec un peu de recul très perfectible, conciste à faire un truc dans le genre (n'étant pas très frais sur SDL j'y vais au pseudo code) :
    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
     
    Gestion des évennements:
       Si enfonce touche
          Si 'haut'
             joueur.vitesseX=0
             joueur.vitesseY=-5
          Fin si
          Si 'bas'
             joueur.vitesseX=0
             joueur.vitesseY=+5
          Fin si
          [...]
       Fin si
       Si relache touche
          Si 'haut' ou 'bas' ou 'gauche' ou 'droite' // On ne s'arrête pas si on relache une touche qui ne sert pas
             joueur.vitesseX=0
             joueur.vitesseY=0
          Fin si
       Fin si
    Ca laisse des trous quand on appuis sur plusieurs touches mais c'est pour donner une idée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Mise a jour du joueur:
       joueur.X+=joueur.vitesseX
       joueur.Y+=joueur.vitesseY
    Et enfin la boucle principale du programme ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Tant que le jeu continue:
       Si assez de temps s'est écoulé depuis la dernière boucle
          Mettre à jour le joueur
          Mettre à jour le monde (monstres & co)
          Afficher
       Sinon
          Attendre un tout petit peu
       Fin si
    Fin tant que
    La condition sur le temps a pour but de figer/limiter la vitesse du jeu sur nos machines surpuissantes et d'éviter que la vitesse de déplacement ne dépende de la vitesse ou l'occupation de celle ci.
    Une alternative pour gérer le temps est de calculer la position en virgule flottante et d'arrondir à l'affichage. On aurait alors plus d'attente mais un calcul du temps écoulé depuis la dernière boucle que l'on passe aux fonctions de mise à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Mise a jour du joueur:
       joueur.X += joueur.vitesseX * temps écoulé
       joueur.Y += joueur.vitesseY * temps écoulé
    Le défaut est que la gestion des évennements va agir sur le joueur qui se retrouve en variable globale. J'aurais une préférence pour garder en global un tableau de booléens qui donne pour chaque code de touche son état. Sur un SDL_KEYDOWN on met la valeur correspondante à true, et à false sur SDL_KEYUP. Ce qui nous donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Mise a jour du joueur
       Si touches[joueur.touche_haut] // comme ça on peut choisir les touches à utiliser
          joueur.Y += vitesse * temps écoulé
       Sinon si touches[joueur.touche_bas]
          joueur.Y -= vitesse * temps écoulé
       [...]
    Citation Envoyé par ironzorg
    alors on appelle la fonction qui fait se déplacer le joueur vers la droite de x pixels vers la droite jusqu'a ce que la touche soit relachée
    Le problème si on procède ainsi est que tant que l'on se déplace il ne peut rien se passer d'autre (du moins pas facilement). De plus la fonction "joueur_va_a_gauche" et ses soeurs réalisent l'affichage ce qui n'est pas très bon pour l'encapsulation.

  8. #8
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    OK c'est bon j'ai compris merci. En revanche il faudra revoir ton code ( nan je rigole ) Merci pour vos conseils

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

Discussions similaires

  1. probleme fluidite
    Par Aknilak dans le forum OpenGL
    Réponses: 15
    Dernier message: 15/06/2004, 09h59
  2. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 19h07
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 20h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 15h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 11h13

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