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

Auteur Sujet: Position de la souris - 2.0  (Lu 6850 fois)

0 Membres et 1 Invité sur ce sujet

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Position de la souris - 2.0
« le: Octobre 27, 2012, 01:46:10 pm »
Bonjour,
Je voulais utiliser la position de la souris pour déplacer un objet quelconque, j'ai donc effectué un test avec un sf::Text, seulement voilà les déplacements sont saccadés, comme si je n'avais pas assez de FPS.
J'ai donc effectué un petit test pour voir quelles valeurs je reçevait pour la position de ma souris :

#include "mainmenu.h"

MainMenu::MainMenu(const tk::EventManager::Data *data)
    : RootMenu(data)
{
    m_text.setString(sf::String("TEST"));
}

void MainMenu::actuateRoot()
{
    if(eventData->textEntered.hasChanged)
    {
        m_text.setString(sf::String(eventData->textEntered.value));
    }
    if(eventData->focus.value && eventData->mouseInWin.value)
    {
        std::cout << sf::Mouse::getPosition(*eventData->targetPtr).x << "\t"
                  << sf::Mouse::getPosition(*eventData->targetPtr).y << "\n";
    }
}

void MainMenu::displayRoot()
{
    eventData->targetPtr->draw(m_text);
}
 

EventManager::Data étant simplement une structure s'actualisant à chaque tour de boucle et récupérant des informations à partir de sf::Event. Voici le résultat :

531     405
x4
704     247
x8
754     98
x2
757     88
x11
etc ...

(je précise que les fonctions actuate et display sont appelées successivement à chaque tour de boucle)
Je me demande d'où viens le problème puisque j'avais bougé ma souris plutôt continuellement et sans trop de saccades.
Merci d'avance de votre aide.

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : Position de la souris - 2.0
« Réponse #1 le: Octobre 31, 2012, 12:01:03 am »
Peut-être que mon sujet est trop flou, je pourrais reformuler plus simplement : est-il normal que je reçoive de telles valeurs ou ai-je fait une connerie  :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Position de la souris - 2.0
« Réponse #2 le: Octobre 31, 2012, 08:22:44 am »
Ce n'est pas flou, mais il est vraiment très difficile de dire ce qui ne va pas. A la limite si tu nous écris un code complet minimal qui reproduit le problème, on pourra éventuellement le tester et le debugger si nécessaire, mais là... ;)
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : Position de la souris - 2.0
« Réponse #3 le: Octobre 31, 2012, 09:17:39 am »
Bon alors me revoilà avec un exemple moins tordu et plus de code  ;D :

int main()
{
    sf::RenderWindow win(sf::VideoMode(200, 100), "TEST");
    win.setFramerateLimit(60);
    tk::EventManager eventMan;
    const tk::EventManager::Data *eventData = eventMan.getData();

    while(win.isOpen())
    {
        eventMan.manage(win);
        win.clear();

        if(eventData->focus.value && eventData->mouseInWin.value)
        {
            std::cout << sf::Mouse::getPosition(*eventData->targetPtr).x << "\t"
                      << sf::Mouse::getPosition(*eventData->targetPtr).y << "\n";
        }

        win.display();
    }

    return EXIT_SUCCESS;
}
 

Et le .h de mon EventManager pour clarifier les choses :

class EventManager
{
public:
    template<typename T>
    struct State
    {
        bool hasChanged;
        T value;
    };

    struct Data
    {
        State<bool> focus;
        State<sf::Vector2i> size;
        State<sf::Uint32> textEntered;
        State<int> mouseWheel;
        State<bool> mouseInWin;
        sf::Clock clock;
        sf::RenderWindow *targetPtr;
    };

    EventManager();

    void manage(sf::RenderWindow &win);
    const Data* getData() const;

protected:
    Data m_data;
};
 

Le résultat étant toujours à peut près le même : je bouge la souris mais les valeurs ne suivent pas. Je peux ajouter que plus je bouge lentement et plus les valeurs sont correctes.

Edit : je me demande si le problème ne viens pas de mon utilisation des sf::Event.
« Modifié: Octobre 31, 2012, 09:19:23 am par Basta »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Position de la souris - 2.0
« Réponse #4 le: Octobre 31, 2012, 09:19:45 am »
Il manque le plus important ;)

Tu arriverais à virer EventManager, et à tout mettre dans un gros main ? Vu que ça concerne la souris, tu peux sans doute virer le code qui gère tous les autres évènements. Essaye de garder uniquement ce qui concerne le problème. Ni plus ni moins.
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : Position de la souris - 2.0
« Réponse #5 le: Octobre 31, 2012, 10:13:54 am »
Alors en simplifiant à fond ça donne ca :)

int main()
{
    sf::RenderWindow win(sf::VideoMode(200, 100), "TEST");
    win.setFramerateLimit(60);
    tk::EventManager::Data data;

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

        data.mouseInWin.hasChanged = false;
        data.focus.hasChanged = false;

        while (win.pollEvent(event))
        {
            switch(event.type)
            {
            case sf::Event::MouseEntered:
                data.mouseInWin.hasChanged = true;
                data.mouseInWin.value = true;
                break;
            case sf::Event::MouseLeft:
                data.mouseInWin.hasChanged = true;
                data.mouseInWin.value = false;
                break;
            case sf::Event::GainedFocus:
                data.focus.hasChanged = true;
                data.focus.value = true;
                break;
            case sf::Event::LostFocus:
                data.focus.hasChanged = true;
                data.focus.value = false;
                break;
            case sf::Event::Closed:
                win.close();
                break;

            default:
                break;
            }
        }

        win.clear();

        if(data.focus.value && data.mouseInWin.value)
        {
            std::cout << sf::Mouse::getPosition(win).x << "\t"
                      << sf::Mouse::getPosition(win).y << "\n";
        }

        win.display();
    }

    return EXIT_SUCCESS;
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Position de la souris - 2.0
« Réponse #6 le: Octobre 31, 2012, 10:24:48 am »
Le problème ne se produit réellement que lorsque tu conditionne l'affichage par focus && mouseIn ? Si tu affiches simplement la position de la souris, sans condition, ça ne merde pas ?
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : Position de la souris - 2.0
« Réponse #7 le: Octobre 31, 2012, 10:59:43 am »
Je viens de faire le test et sans la condition les valeurs sont "fluides"

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : Position de la souris - 2.0
« Réponse #8 le: Octobre 31, 2012, 11:00:44 am »
Enfait non, les valeurs sont fluides uniquement lorsque ma souris est hors de la fenêtre :/

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Position de la souris - 2.0
« Réponse #9 le: Octobre 31, 2012, 11:08:00 am »
Donc concrètement, ceci a toujours le problème tant que la souris reste dans la fenêtre ?

int main()
{
    sf::RenderWindow win(sf::VideoMode(200, 100), "TEST");
    win.setFramerateLimit(60);

    while(win.isOpen())
    {
        sf::Event event;
        while (win.pollEvent(event))
            ;

        win.clear();
        std::cout << sf::Mouse::getPosition(win).x << "\t" << sf::Mouse::getPosition(win).y << std::endl;
        win.display();
    }

    return EXIT_SUCCESS;
}

Est-ce que virer setFramerateLimit change quelque chose ?
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : Position de la souris - 2.0
« Réponse #10 le: Octobre 31, 2012, 11:32:11 am »
Donc concrètement, ceci a toujours le problème tant que la souris reste dans la fenêtre ?
[...]
Est-ce que virer setFramerateLimit change quelque chose ?

Exactement, les valeurs sont fluides quand je bouge la souris en dehors de la fenêtre et saccadées dedans.
Quand je vire la limite rien ne change.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Position de la souris - 2.0
« Réponse #11 le: Octobre 31, 2012, 11:33:45 am »
Et est-ce que tu peux essayer la même chose, mais en appelant sf::Mouse::getPosition() (sans paramètre) ?
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : Position de la souris - 2.0
« Réponse #12 le: Octobre 31, 2012, 11:40:35 am »
Exactement la même réaction, même si les valeurs ne sont plus les mêmes.

Edit : d'ailleurs je me rappelle avoir d'abord utilisé les sf::Event pour récupérer cette position et j'avais le même problème
« Modifié: Octobre 31, 2012, 11:47:21 am par Basta »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Position de la souris - 2.0
« Réponse #13 le: Octobre 31, 2012, 11:50:52 am »
Ok. Il faudra que je teste ça à l'occase.
Laurent Gomila - SFML developer

Basta

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
    • E-mail
Re : Position de la souris - 2.0
« Réponse #14 le: Octobre 31, 2012, 11:51:57 am »
Pour être plus précis, j'ai l'impression que lorsque je bouge ma souris trop rapidement, les valeurs sortent par grappes, identiques et retardées. Lorsque je ne bouge pas la souris les valeurs sortent bien au goutte à goutte. Si je "trace" des cercles rapides, plus aucune valeur ne sort.