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

Auteur Sujet: Problème déplacement  (Lu 3219 fois)

0 Membres et 1 Invité sur ce sujet

Faren

  • Newbie
  • *
  • Messages: 26
    • Voir le profil
Problème déplacement
« le: Septembre 16, 2013, 07:09:39 pm »
  Bonjour,

Ayant récemment installé la SFML je fais quelques tests de programme.
Mais j'ai un problème pour le déplacement d'un personnage, en effet dès que je reste appuyer sur la touche 'Z' par exemple mon sprite ne bouge qu'au bout d'un moment (comme dans un éditeur de texte lorsque l'on reste appuyer sur une lettre) . Comment régler le problème ?

Voici mon code :
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(400, 400), "SFML Test");
    sf::Texture tPerso;
    sf::Sprite sPerso;
    sf::Image iPerso;




    if(!iPerso.loadFromFile("Personnage.png"))
    {

    }
sf::Color fond=iPerso.getPixel(0,0);
    iPerso.createMaskFromColor(fond);
    tPerso.loadFromImage(iPerso);
    sPerso.setTexture(tPerso);
    window.setKeyRepeatEnabled(true);


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

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();

            if(event.type==sf::Event::KeyPressed)
                {

                    switch(event.key.code)
                    {

                    case sf::Keyboard::Z:
                       sPerso.move(0,-1);
                       break;

                    case sf::Keyboard::Q:
                       sPerso.move(-1,0);
                       break;

                    case sf::Keyboard::S:
                       sPerso.move(0,1);
                       break;

                    case sf::Keyboard::D:
                       sPerso.move(1,0);
                       break;
                       default: break;

                    }


               }
        }
        window.clear(sf::Color::White);
        window.draw(sPerso);
        window.display();
        }




        return 0;
    }



 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème déplacement
« Réponse #1 le: Septembre 16, 2013, 07:18:26 pm »
Merci de lire les tutoriels avant de poster.

Citation de: Le tutoriel
Parfois, les gens utilisent l'évènement KeyPressed pour gérer des mouvements continus. Or, cela ne produira pas des mouvements continus mais plutôt saccadés : lorsque vous maintenez une touche vous n'obtenez en effet que quelques évènements (souvenez-vous du délai de répétition). Les mouvements fluides peuvent être obtenus en utilisant les entrées temps réel avec sf::Keyboard (voir le tutoriel dédié).
(oui, c'est aussi écrit en rouge dans le tutoriel)
Laurent Gomila - SFML developer

Faren

  • Newbie
  • *
  • Messages: 26
    • Voir le profil
Re : Problème déplacement
« Réponse #2 le: Septembre 16, 2013, 07:23:02 pm »
Voici ce que j'avais fait avant de changer
while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();

            if(event.type==sf::Event::KeyPressed)
                {
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
                       sPerso.move(0,-1);

                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
                       sPerso.move(-1,0);

                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
                       sPerso.move(0,1);

                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
                       sPerso.move(1,0);

                else;


               }
        }
        window.clear(sf::Color::White);
        window.draw(sPerso);
        window.display();
        }
 

et ça ne marchait pas non plus. Ou alors j'ai mal lu le tuto

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème déplacement
« Réponse #3 le: Septembre 16, 2013, 07:25:24 pm »
Si tu utilises ces fonctions dans la boucle d'évènements tu perds tout l'intérêt. Elles existent justement pour ne pas être lié aux évènements, et pouvoir savoir à tout moment l'état de ton clavier.

Là avec ce code tu ne vas quand même bouger que si un évènement survient, donc tu n'as rien gagné du tout par rapport à ton précédent code.
Laurent Gomila - SFML developer

Faren

  • Newbie
  • *
  • Messages: 26
    • Voir le profil
Re : Problème déplacement
« Réponse #4 le: Septembre 16, 2013, 07:31:40 pm »
excuse moi mais j'ai du mal à comprendre, où devrais je donc mettre ces conditions ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème déplacement
« Réponse #5 le: Septembre 16, 2013, 08:55:57 pm »
Tu veux bouger ton sprite quand ? Quand un évènement clavier survient, ou bien tout le temps en continu ? Tout le temps en continu -> donc tu mets ce code directement dans ta boucle de jeu, hors de la boucle d'évènements ;)
Laurent Gomila - SFML developer

Faren

  • Newbie
  • *
  • Messages: 26
    • Voir le profil
Re : Problème déplacement
« Réponse #6 le: Septembre 16, 2013, 09:38:57 pm »
je viens de le faire mais maintenant le personnage ne bouge plus quoi que je fasse.

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

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();



        }


if(event.type==sf::Event::KeyPressed)
                {
                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
                       sPerso.move(0,-1);

                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
                       sPerso.move(-1,0);

                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
                       sPerso.move(0,1);

                    if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
                       sPerso.move(1,0);

                else;

                  }
                 
        window.clear(sf::Color::White);
        window.draw(sPerso);
        window.display();
        }
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème déplacement
« Réponse #7 le: Septembre 16, 2013, 09:51:49 pm »
Tu n'es plus dans la boucle d'évènements, donc il ne faut plus utiliser ton sf::Event.
Laurent Gomila - SFML developer

Faren

  • Newbie
  • *
  • Messages: 26
    • Voir le profil
Re : Problème déplacement
« Réponse #8 le: Septembre 16, 2013, 09:57:30 pm »
Merci, ça marche.
Sinon vu qu'il se déplaçait rapidement j'ai fait window.setFramerateLimit(30); est ce la bonne méthode ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème déplacement
« Réponse #9 le: Septembre 16, 2013, 10:04:59 pm »
Mieux vaut définir une vitesse et faire un déplacement en fonction du temps écoulé ; comme ça tu as du code qui est indépendant du framerate.

const float speed = 100; // 100 unités / seconde

sf::Clock clock;

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

    float elapsed = clock.restart().asSeconds();

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
        sprite.move(speed * elapsed, 0);
    ...
}
Laurent Gomila - SFML developer

Faren

  • Newbie
  • *
  • Messages: 26
    • Voir le profil
Re : Problème déplacement
« Réponse #10 le: Septembre 16, 2013, 10:15:30 pm »
Ah oui ! c'est vraiment pas mal, j'y aurais pas pensé. Merci!