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

Auteur Sujet: [SFML 2.2] Problème avec les évènements ?  (Lu 1777 fois)

0 Membres et 1 Invité sur ce sujet

Timidouveg

  • Full Member
  • ***
  • Messages: 164
    • Voir le profil
    • Démiurge - Mon jeu-vidéo en développement
[SFML 2.2] Problème avec les évènements ?
« le: Juillet 19, 2015, 05:37:28 pm »
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.
C'est simple, c'est rapide, c'est libre et en plus c'est français ? Qu'est-ce que vous attendiez pour m'en parler ?

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : [SFML 2.2] Problème avec les évènements ?
« Réponse #1 le: Juillet 19, 2015, 10:55:31 pm »
T'utilises pas directement SFML dans ce code mais des trucs à toi, one ne sait pas ce qui peut se passer dans tes HandleEvent ou PollEvent ou HandleInput.

Fais un simple programme de 30 lignes avec juste SFML où tu observes les évènements MouseMoved, lance le et reçoit des messages Pidgin ou Skype, et s'il se passe rien c'est que ça vient probablement du code que tu as écrit et qu'on ne voit pas.
Ton problème est chelou. :D Dans ton jeu, tu remets tout le temps la souris à un même endroit (avec sf::Mouse::setPosition) ?
« Modifié: Juillet 19, 2015, 10:58:38 pm par G. »

Timidouveg

  • Full Member
  • ***
  • Messages: 164
    • Voir le profil
    • Démiurge - Mon jeu-vidéo en développement
Re : [SFML 2.2] Problème avec les évènements ?
« Réponse #2 le: Juillet 20, 2015, 06:14:27 pm »
En fait mon RenderWindow n'est qu'une façade en inline de celui de SFML, donc PollEvent, fait juste pollEvent.
Enfin, j'ai fais un test avec du code minimal comme ceci :
#include <SFML/Window.hpp>
#include <iostream>

int main ( void ) {
  sf::Window sfWindow (sf::VideoMode (800, 600), "My window");

  while (sfWindow.isOpen ()) {
    sf::Event sfEvent;

    while (sfWindow.pollEvent (sfEvent)) {
      // Elementary events for the main window of the game
      switch (sfEvent.type) {
        // Close window :
        case sf::Event::Closed :
          sfWindow.close ();
          break;
        // Events of the mouse
        case sf::Event::MouseMoved :
          std::cout << "Event::Type::MouseMoved" << std::endl;
          break;
        default :
          break;
      }
    }
  }

  return EXIT_SUCCESS;
}
Le problème se répète pour la souris. Et ça fait bien deux signaux de mouvement de souris, comme le bug que j'avais déjà observé il y a longtemps  :-\
C'est simple, c'est rapide, c'est libre et en plus c'est français ? Qu'est-ce que vous attendiez pour m'en parler ?