Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [SFML2] Déplacement d'un RectangleShape saccadé  (Lu 3525 fois)

0 Membres et 1 Invité sur ce sujet

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
[SFML2] Déplacement d'un RectangleShape saccadé
« le: Septembre 30, 2012, 02:27:08 pm »
Bonjour à tous.
Je suis passé de la SFML 1.6 à 2.0 et je rencontre un soucis pour bouger un RectangleShape à l'écran.

Avec la 1.6 je déplaçais mon rectangle comme ça :
rectangle.Move(0, -300 * fenetre.GetFrameTime());

Avec la 2.0, GetFrameTime() a disparu. J'ai tenté diverses méthodes avec les Clock mais sans grand succès. Le seul code qui fonctionne à peu près est :
sf::Clock clock;
float frameTime = clock.getElapsedTime().asMicroseconds();
rectangle.move(0, -3 * frameTime);
Cependant il y a parfois dans "sauts" dans le déplacement, comme des frames manquantes, et on voit bien que la valeur de "frameTime" du second code n'est pas la même que fenetre.GetFrameTime().

Comment récupérer la même valeur que GetFrameTime() avec la SFML 2 ?
Merci d'avance.

PS : les deux codes se trouvent entre le clear() et le display().
« Modifié: Septembre 30, 2012, 05:33:52 pm par Nikogram »

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Messages: 4321
    • Voir le profil
    • E-mail
Re : [SFML2] GetFrameTime
« Réponse #1 le: Septembre 30, 2012, 03:18:50 pm »
SFML / OS X developer

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Re : [SFML2] GetFrameTime
« Réponse #2 le: Septembre 30, 2012, 03:47:05 pm »
En me servant du lien que tu m'as donné, ce n'est toujours pas fluide :
sf::Clock clock;
sf::Time elapsed = clock.restart();
move(0, -3 *  (1 * elapsed.asMicroseconds()));

Le déplacement est toujours saccadé.

EDIT : c'est bon j'ai réglé le problème.
C'est qu'il fallait récupérer le frameTime en dehors du clear/display.

Par contre autre problème : je code mon rectangle de tel sorte à ce qu'il s'arrête 10 pixel avant le bord. Or parfois il s'arrête 5 px avant et non 10px. Y aurait t'il quelque chose à faire pour éviter ce bug ?

Mon code :
if (sf::Keyboard::isKeyPressed(m_idJoueur == 0 ? sf::Keyboard::Z : sf::Keyboard::Up) && getPosition().y >= 10)
                move(0, ceil(-300 * tempsFrame));
if (sf::Keyboard::isKeyPressed(m_idJoueur == 0 ? sf::Keyboard::S : sf::Keyboard::Down) && getPosition().y <= m_fenetre.getSize().y - 110)
                move(0, ceil(300 * tempsFrame));

EDIT 2 : j'ai aussi réussi à corriger ce bug là. Il faut simplement modifier sa position quand il va au delà des 10px du bord.
« Modifié: Septembre 30, 2012, 04:26:46 pm par Nikogram »

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Re : [SFML2] Déplacement d'un RectangleShape saccadé
« Réponse #3 le: Septembre 30, 2012, 05:36:23 pm »
Re-bonjour. J'ai enfaite un autre problème.
Quand je déplace mon rectangle en fonction du frametime, le déplacement n'est pas toujours fluide.

Comment rendre le déplacement plus fluide ?
Merci d'avance.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2] Déplacement d'un RectangleShape saccadé
« Réponse #4 le: Septembre 30, 2012, 06:35:54 pm »
Est-ce que tu limites ton framerate d'une façon ou d'une autre ? Il faut savoir que les framerates très élevés produisent des mouvements pas toujours fluides.
Laurent Gomila - SFML developer

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Re : [SFML2] Déplacement d'un RectangleShape saccadé
« Réponse #5 le: Septembre 30, 2012, 08:14:26 pm »
J'active juste la synchronisation verticale.
J'ai testé sur un PC de bureau bas/moyen de gamme : saccades
Sur un PC portable bas de gamme : aucune saccades
Sur mon PC portable plus puissant que les deux autres PC : saccades
J'ai deux amis qui ont testé le programme et eux ne voient pas les saccades (l'un d'eux à un PC haut de gamme).

PS : les saccades apparaissent toutes les deux-trois secondes et sont très brèves, mais assez gênantes.