Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: Basta le Octobre 27, 2012, 01:46:10 pm

Titre: Position de la souris - 2.0
Posté par: Basta 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.
Titre: Re : Position de la souris - 2.0
Posté par: Basta 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  :)
Titre: Re : Position de la souris - 2.0
Posté par: Laurent 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à... ;)
Titre: Re : Position de la souris - 2.0
Posté par: Basta 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.
Titre: Re : Position de la souris - 2.0
Posté par: Laurent 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.
Titre: Re : Position de la souris - 2.0
Posté par: Basta 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;
}
Titre: Re : Position de la souris - 2.0
Posté par: Laurent 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 ?
Titre: Re : Position de la souris - 2.0
Posté par: Basta le Octobre 31, 2012, 10:59:43 am
Je viens de faire le test et sans la condition les valeurs sont "fluides"
Titre: Re : Position de la souris - 2.0
Posté par: Basta le Octobre 31, 2012, 11:00:44 am
Enfait non, les valeurs sont fluides uniquement lorsque ma souris est hors de la fenêtre :/
Titre: Re : Position de la souris - 2.0
Posté par: Laurent 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 ?
Titre: Re : Position de la souris - 2.0
Posté par: Basta 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.
Titre: Re : Position de la souris - 2.0
Posté par: Laurent 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) ?
Titre: Re : Position de la souris - 2.0
Posté par: Basta 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
Titre: Re : Position de la souris - 2.0
Posté par: Laurent le Octobre 31, 2012, 11:50:52 am
Ok. Il faudra que je teste ça à l'occase.
Titre: Re : Position de la souris - 2.0
Posté par: Basta 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.
Titre: Re : Position de la souris - 2.0
Posté par: Laurent le Octobre 31, 2012, 12:19:25 pm
Tu as une souris haute résolution ?
Titre: Re : Position de la souris - 2.0
Posté par: Basta le Octobre 31, 2012, 12:21:56 pm
Je suis à 4000 dpi
Titre: Re : Position de la souris - 2.0
Posté par: Laurent le Octobre 31, 2012, 12:28:29 pm
Je pense que ça veut dire "oui". Du coup ceci explique cela, je crois même qu'il y a un ticket pour ça sur le bug tracker.
Titre: Re : Position de la souris - 2.0
Posté par: Basta le Octobre 31, 2012, 12:31:33 pm
Ahh donc c'est à cause d'une résolution trop élevée, bizarre que cela ne se passe que lorsque je suis dans la fenêtre.

Edit: j'ai testé à 800 et 1800 dpi et j'ai toujours le même problème :/, mais en même temps c'est toujours la même souris.
Titre: Re : Position de la souris - 2.0
Posté par: Laurent le Octobre 31, 2012, 01:00:17 pm
Il faudrait que tu essayes avec une autre souris. Ou carrément sur un autre PC.