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 !).