Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - aniwey

Pages: [1]
1
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.. :)

2
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 :/

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

4
Effectivement, ça a l'air d'être ça... En regardant le man de mon pilote ("man intel") :

       Option "SwapbuffersWait" "boolean"
              This option controls the behavior of glXSwapBuffers and glXCopySubBufferMESA calls by GL applications.  If enabled, the calls will avoid tearing by making sure the display scanline is outside of the
              area  to  be  copied  before the copy occurs.  If disabled, no scanline synchronization is performed, meaning tearing will likely occur.  Note that when enabled, this option can adversely affect the
              framerate of applications that render frames at less than refresh rate.

              Default: enabled.

Du coup, j'imagine qu'on ne peut pas contourner la chose sans demander aux utilisateurs de désactiver leur synchro verticale ou sans faire du threading? ^_^

Merci beaucoup en tout cas pour cette réponse rapide :)

5
Bonjour!

Cela fait longtemps que je n'ai pas utilisé la SFML et j'y reviens depuis peu pour un projet. Cependant je rencontre un problème : l'affichage me semble assez lent. Lorsque je fais un display() sur un renderWindow qui n'affiche rien, cela prend en moyenne 16 millisecondes. Quand quelque chose doit être affiché (un simple fond rouge), c'est alors très chaotique : entre 8 et 20 millisecondes par boucle d'affichage..

Voici le code minimal qui produit le problème :

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

int main(void){
  sf::RenderWindow window(sf::VideoMode(800, 600), "test");
  sf::Clock clock;
  float a;

  a = clock.getElapsedTime().asSeconds();
  for(int i = 0; i < 100; ++i){
    window.display();
  }
  std::cout << clock.getElapsedTime().asSeconds() - a << std::endl;
}
 

Ce bout de code affiche des valeurs légèrement supérieures à 1.6 en moyenne, soit 1.6 secondes pour 100 affichages. Est-ce normal? Cela peut-il venir de mon ordinateur? (pas de carte graphique, chipset Intel, sur une archlinux mise à jour)

Merci d'avance!

Pages: [1]