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

Auteur Sujet: [Issue] : Déplacement d'un Sprite  (Lu 6012 fois)

0 Membres et 1 Invité sur ce sujet

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
[Issue] : Déplacement d'un Sprite
« le: Août 22, 2017, 06:06:52 pm »
Bonjour à tous !

Je me tourne vers vous car après moulte tentatives pour tenter de régler le souci mais sans jamais y parvenir, je suis à court d'idées :) . Je m'explique.

Le script n'est pas compliqué, il consiste à faire bouger un personnage de gauche à droite. Le personnage est sous forme d'objet contenant le nécessaire pour l'afficher (window/texture/...) et actualiser sa position. J'ai aussi créé un objet s'occupant de la vue principale (qui est fixe pour le moment).

Pour bouger le personnage, j'utilise un tableau de booléen pour garder un mouvement fluide.

Le problème : Malheureusement la fluidité n'est pas au rendez-vous, parfois le personnage se met à saccader sans raison. Je ne pense pas que cela vienne de l'event étant donné que le bool reste bien en position true lorsque la touche est enfoncée. J'ai un doute au niveau du Draw pour le Sprite du perso que je récupère via le perso lui-même (opération trop lourde ?). Ce qui est étrange c'est que cela ne se produit pas à tous les coups, c'est purement aléatoire.

Voici une vidéo qui montre le mouvement saccadé :
(à mettre en 1080p60 si possible, les résolutions plus basse accentuent la saccade et ne sont pas représentatives)



Et le code source :

main.cpp -> https://pastebin.com/K04ANeyy
Personnage.h -> https://pastebin.com/8Mi1mxt4
Personnage.cpp -> https://pastebin.com/gYFh2uU1
Vue.h -> https://pastebin.com/rFiu1NeW
Vue.cpp -> https://pastebin.com/7cMcqJ28

Si jamais quelqu'un à une idée sur la provenance du souci, je suis preneur ;).
« Modifié: Août 22, 2017, 06:08:43 pm par Guit0x »

Guillaume__

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
Re: [Issue] : Déplacement d'un Sprite
« Réponse #1 le: Août 22, 2017, 08:53:23 pm »
Salut Guit0x,

Tout d'abord essayes de nous fournir des sources minimales pour pas qu'on perde de temps à étudier tout tes fichiers (choses que je n'ai bien évidemment pas fait :)).

Pour répondre à ton problème, ou du moins essayer de t'orienter à sa résolution, si tu souhaites avoir un mouvement fluide je te conseille de traiter tes déplacements en real-time. Cela sera bien plus efficace, n effet avec les events tu perds en rapidité à chaque fois que tu changeras de touche (Changement du mouvement de droite à gauche par exemple). Après ne te tracasse pas pour ce genre de problème ce n'est vraiment rien pour tout te dire je n'ai vu aucun ralentissement sur ta vidéo ^^

Un indice :
sf::Keybord::isKeyPressed(sf::Keyboard::MaKey)); //dans ta main loop.

Courage :)
Cordialement G
Rejoignez-nous sur le serveur
Discord SFML

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
Re: [Issue] : Déplacement d'un Sprite
« Réponse #2 le: Août 22, 2017, 10:08:37 pm »
Tout d'abord essayes de nous fournir des sources minimales

Ce n'est pas dans mes habitudes de balancer le code complet comme un bourrin mais là il est plutôt simpliste et j'ai l'impression que le souci peut venir de n'importe où. Mais j'essaierai d'écourter la prochaine fois c'est noté ;).

...si tu souhaites avoir un mouvement fluide je te conseille de traiter tes déplacements en real-time.

Testé, mais ça n'a rien changé malheureusement. Et  l'utilisation d'un array de booléen permet d'obtenir des mouvements fluides en principe. Un petit exemple pour illustrer :

enum keys { UP, DOWN, LEFT, RIGHT, SPACE, KEY_MAX };
bool activeKeys[KEY_MAX] = { false };

int main()
{
    while (window.isOpen())
    {
        sf::Event event;

        //pollEvent
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::KeyPressed)
            {
                if (event.key.code == sf::Keyboard::Q) { activeKeys[LEFT] = true; }
            }

            if (event.type == sf::Event::KeyReleased)
            {
                if (event.key.code == sf::Keyboard::Q) { activeKeys[LEFT] = false; }
            }
        }
        //fin pollEvent

        //Move Perso
        if (activeKeys[LEFT]) { monPerso->move(LEFT); }
    }
}

Est-t-il possible qu'il y ait un "fail" au niveau du pollEvent pendant ne serait-ce qu'un seul passage de boucle et que de ce fait la valeur de sf::Event::KeyPressed passe à NULL et donc que ce soit considéré comme une touche relâchée ?

Edit: Je viens de regarder l'état des valeurs de activeKeys[] en console et tout est correct, pas un seul changement d'état tant que la touche est enfoncée. A part ça tout va bien maintenant, j'ai reboot win 10 et plus de souci  ;D.
« Modifié: Août 22, 2017, 11:17:30 pm par Guit0x »

Guillaume__

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
Re: [Issue] : Déplacement d'un Sprite
« Réponse #3 le: Août 23, 2017, 09:14:45 am »
Bonjour,

Donc finalement on ne aura pas véritablement su la source de ton problème ???
Cela aurait pu venir de l'OS ? D'une mise à jour de la carte graphique manquante ?

G
Rejoignez-nous sur le serveur
Discord SFML

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
Re: [Issue] : Déplacement d'un Sprite
« Réponse #4 le: Août 23, 2017, 10:48:45 am »
Du côté des drivers pas de souci, ils sont à jour. Mais j'avais déjà eu ce genre de problème il y a 2 semaines environ, quelque soit le jeu il saccadait et après reboot plus rien. Si ce souci repointe le bout de son nez je mènerai mon enquête du côté des processus actifs.

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re: [Issue] : Déplacement d'un Sprite
« Réponse #5 le: Août 24, 2017, 12:24:05 am »
Ta méthode move() ici : https://pastebin.com/gYFh2uU1
n'utilise pas de deltatime , d'ou certainement le manque de "fluidité" 
de plus , en ne l'utilisant pas, ton programme marchera bien pour ton PC, mais sur un autre ( un pc 10x plus puissant par ex) il avancera 10x plus vite, idem pour un PC bas de gamme, le déplacement sera plus lent.
La vitesse variera aussi en fonction de la charge de ton pc ( av , prog en arrière plan, etc... )

void Personnage::move(int direction, float dt){

switch(direction){
   case 2:
        m_x -= m_speed * dt  ;
        break;
...
...

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
Re: [Issue] : Déplacement d'un Sprite
« Réponse #6 le: Août 24, 2017, 12:17:30 pm »
Ta méthode move() n'utilise pas de deltatime

Ah justement tu soulèves un point intéressant, c'est une question que je me suis posé et n'ayant pas de second PC, je n'ai pas pu tester la vitesse d'execution sur une autre machine.

Donc concrètement dt est déterminé selon la machine utilisée pour ajuster la vitesse du jeu c'est bien ça ? Mais quelle sont les composantes pour calculer dt ? (horloge ? framerate ?)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: [Issue] : Déplacement d'un Sprite
« Réponse #7 le: Août 24, 2017, 02:29:21 pm »
dt c'est juste le temps qui a passé depuis le dernier update. Ton déplacement devient donc "vitesse x temps", au lieu d'être un chiffre arbitraire.

sf::Clock clock;

while (window.isOpen())
{
    // ...

    auto dt = clock.reset();
    monPerso->move(direction, dt.asSeconds());
}
Laurent Gomila - SFML developer

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
Re: [Issue] : Déplacement d'un Sprite
« Réponse #8 le: Août 24, 2017, 02:47:47 pm »
D'accord je vois. Je vais de ce pas modifier cela. Merci beaucoup pour l'info !