Bonjour à tous,
J'ai cherché sur le forum et sur internet, j'espère ne pas être passé à côté de la réponse. Excusez-moi donc si ce sujet a déjà été traité :s
Je rencontre un problème avec mon code pour les évènements pour la version 2.2 de SFML. Je ne sais pas si l'origine est mon code, SFML ou l'OS (Windows 7). J'ai observé deux comportements dont qui un arrive tout le temps, et l'autre qui arrive parfois.
- Événement régulier : Lorsque je suis sur mon jeu, fenêtre active, je ne touche pas à ma souris, dés que j'ai un message sur Pidgin (actif derrière pour papoter) ou que je change de fenêtre avec la combinaison de touches Alt-tab, un évènement de mouvement de souris s'active.
- Événement aléatoire : Lorsque je lance mon jeu, alors qu'il y une conversation avec souvent des alertes sur Skype, je tombe dans mon jeu (en réalité je descends), c'est à dire que l'évènement de la touche 3 du pavé numérique s'active et cette fois ne s'arrête pas.
Je vous mets mon code ici, et vous remercie pour votre aide
void Game::ProcessInput ( void ) {
gm::RenderWindow& gmMainWindow = GetWindow (RenderTargets::ID::MainWindow);
Event::Type eEventType = Event::Type::None;
sf::Keyboard::Key sfKeyCode = sf::Keyboard::Key::Unknown;
sf::Event sfEvent;
while (gmMainWindow.PollEvent (sfEvent)) {
// Elementary events for the main window of the game
switch (sfEvent.type) {
// Close window :
case sf::Event::Closed :
eEventType = Event::Type::Closed;
break;
// Resize window :
case sf::Event::Resized :
gmMainWindow.SetView (sf::View (sf::FloatRect (0.f, 0.f, static_cast<GLfloat> (sfEvent.size.width), static_cast<GLfloat> (sfEvent.size.height))));
gmMainWindow.SetSize (sf::Vector2u (sfEvent.size.width, sfEvent.size.height));
ComputeWindowCenter ();
eEventType = Event::Type::Resized;
break;
// Events of the keyboard
case sf::Event::KeyPressed :
eEventType = Event::Type::KeyPressed;
sfKeyCode = sfEvent.key.code;
break;
// Events of the mouse
case sf::Event::MouseMoved :
if (!m_bPassMouseMoved) {
eEventType = Event::Type::MouseMoved;
// For the loop pass the redondant MouseMoved generated by
// the changement of the position (probably a bug in the function
// SetCursorPos for Microsoft Windows. I haven't checked for other OS).
m_bPassMouseMoved = GL_TRUE;
} else
eEventType = Event::Type::None;
break;
case sf::Event::MouseWheelMoved :
if (sfEvent.mouseWheel.delta > 0)
eEventType = Event::Type::MouseWheelUp;
else
eEventType = Event::Type::MouseWheelDown;
break;
default :
eEventType = Event::Type::None;
break;
}
// Call of the HandleEvent of the states of the game
if (eEventType != Event::Type::None)
m_oStateStack.HandleEvent (eEventType, sfKeyCode);
}
// Unlock the MouseMoved for the next tick.
if (m_bPassMouseMoved)
m_bPassMouseMoved = GL_FALSE;
// Call of the HandleInput of the states of the game
m_oStateStack.HandleInput ();
}
Pour ce passage, m_bPassMouseMoved = GL_TRUE; j'ai eu un soucis de répétition du mouvement de la souris, il y a pas mal de temps, et j'avais trouvé sur internet qu'un bug dans Windows en serait à l'origine. J'avais résolu ce problème en faisant cette pirouette. Mais, je ne suis sûr de rien
Le reste du code n'est pas utile à mon avis, car j'ai mis un std::cout dans la condition du mouvement de la souris et il m'affiche bien le texte à chaque fois que :
- Une alerte Pidgin, et peut-être d'autres programmes, se déclenche.
- Je bascule vers une autre fenêtre.
- Je bascule vers la fenêtre du jeu.
- Lorsque le jeu passe d'un état à un autre (écran d'information, écran titre, écran de jeu), donc dans la même fenêtre, mais uniquement si une alerte à eu lieu et que je n'ai pas répondu. Ça peut carrément cumuler deux mouvement de souris parfois à ce moment. Et c'est un peu aléatoire apparemment.
J'ai codé une version avec GainedFocus et LostFocus, mais ça n'y change strictement rien. J'ai comme l'impression que c'est le même bug qu'il y a longtemps.