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

Auteur Sujet: Le déplacement de la souris toujours détecté avec un pixel de décalage ?  (Lu 3175 fois)

0 Membres et 1 Invité sur ce sujet

aniwey

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Bonjour!

Dans mon programme je cherche à maintenir la souris au centre de l'écran (comme dans les FPS) pour ne m'occuper que de son déplacement relatif. Pour cela, lors de la boucle d'évènements, quand je détecte un évènement mouseMoved je compare la nouvelle position de la souris par rapport au centre de l'écran, puis je replace la souris au centre de l'écran. J'ai réduit le problème que je recontre au code suivant :

#include <SFML/Graphics.hpp>
#include <iostream>

int main(void){
  sf::RenderWindow window(sf::VideoMode(800, 600), "test");
  window.setFramerateLimit(10);
  sf::Event event;

  while(1){
    while(window.pollEvent(event)){
      switch(event.type){
        case sf::Event::MouseMoved:
          if(sf::Mouse::getPosition(window) != sf::Vector2i(400, 300)){ // Cette vérification est nécessaire car setPosition lance un évènement mouseMoved
            std::cout << 300 - event.mouseMove.y << std::endl;
            sf::Mouse::setPosition(sf::Vector2i(400, 300), window);
          }
        break;
      }
    }
  }

  return 0;
}

Ce code affiche donc, à chaque boucle d'évènements, le déplacement relatif vertical qu'a effectué la souris. Or, cela fonctionne bien, mais à un pixel près :
  - Si je bouge le curseur vers le haut très doucement, cela affiche 1, et quand je vais plus vite ce nombre augmente. (normal jusque là)
  - Si je bouge le curseur vers le bas très doucement, cela affiche 1, quand je vais un peu plus vite cela affiche 0, et quand je vais encore plus vite des valeurs négatives de plus en plus petites (-1, -2, -3..) sont affichées. Or cela ne devrait vraisemblablement pas afficher 0 et encore moins 1 quand je bouge le curseur vers le bas..

J'ai au départ pensé que le problème venait du fait que je ne prenais pas en compte les positions de la souris par rapport à la fenêtre, mais après avoir rajouté l'argument window aux getPosition et setPosition, cela ne change rien. Par ailleurs, même en plein écran et avec la résolution exacte de mon ordinateur le problème se pose toujours.

Voilà! Merci :)

EDIT : après vérification, le problème se pose uniquement quand j'utilise mon touchpad, plus de problème avec une souris. Mais je ne comprends pas pourquoi oO (mon touchpad ne pose pas de problème dans d'autres programmes ni lors d'une utilisation "normale" de la souris dans SFML..)

EDIT : j'ai testé sur un autre ordinateur portable, même problème. J'en aurai un plus grand nombre à ma disposition bientôt, je ferai plus de tests.. (et sur des OS différents, j'ai testé uniquement sous Archlinux pour l'instant)

EDIT : testé sur un Sony Vaio SA sous Archlinux, même problème

EDIT : testé sur un ordinateur avec la dernière Ubuntu, même problème. Par ailleurs, pour apporter des précisions : le décalage ne se fait pas seulement vers le haut mais aussi sur la gauche, et il semble être d'exactement un pixel. En effet, quand je modifie la position capturée chaque frame en lui ajoutant un pixel selon x et un pixel selon y, cela contrebalance, et il n'y a plus de problème (mais cela ne semble pas une solution acceptable, bien sûr, surtout que je ne peux pas faire la différence entre touchpad et souris !).
« Modifié: Janvier 22, 2013, 09:15:28 pm par aniwey »

Bigz

  • Full Member
  • ***
  • Messages: 154
    • Voir le profil
    • Bigz.fr
Que tu retrouve le problème vers le bas et à gauche me semble cohérent.

Je vais d'ailleurs dire un truc peut être bête mais ton centre exacte est formé par 4 pixels, et non 1 puisque la taille de ta résolution est un chiffre paire en vertical comme en horizontal. Du coup, comme les positions commencent à 0.0 et non 1.1, ton pixel de référence à 400.300 doit être le supérieur droit de ce "centre de 4 pixels".

Il faut surement prendre ça en compte.

aniwey

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Mmh, mais selon cette logique, pourquoi le problème se poserait-il avec les touchpads et pas avec une souris?

Par ailleurs, je viens d'essayer de placer le curseur à des positions différentes (400-1 et 300-1, 400+1 et 300+1...), aucune ne corrige le problème :/

aniwey

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Peut-être ma méthode pour récupérer le déplacement relatif de la souris est-elle mauvaise?

Je ne sais pas trop quoi faire, j'ai vraiment besoin de travailler avec les déplacements relatifs, et je me vois mal devoir faire deux programmes différents, un pour être utilisé avec la souris et un avec le touchpad dans lequel je décalerais le curseur d'un pixel...

Ou sinon, peut-être que la SFML prévoit dans une version future de donner directement accès au déplacement relatif de la souris? Si c'est plus ou moins prévu, ça me va, je peux attendre.. :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Ce n'est pas vraiment prévu pour l'instant, désolé.
Laurent Gomila - SFML developer

 

anything