-
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.
-
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 :)
-
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à... ;)
-
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.
-
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.
-
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;
}
-
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 ?
-
Je viens de faire le test et sans la condition les valeurs sont "fluides"
-
Enfait non, les valeurs sont fluides uniquement lorsque ma souris est hors de la fenêtre :/
-
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 ?
-
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.
-
Et est-ce que tu peux essayer la même chose, mais en appelant sf::Mouse::getPosition() (sans paramètre) ?
-
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
-
Ok. Il faudra que je teste ça à l'occase.
-
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.
-
Tu as une souris haute résolution ?
-
Je suis à 4000 dpi
-
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.
-
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.
-
Il faudrait que tu essayes avec une autre souris. Ou carrément sur un autre PC.