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

Auteur Sujet: [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris  (Lu 4559 fois)

0 Membres et 1 Invité sur ce sujet

chapa

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
[Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
« le: Septembre 05, 2012, 05:02:57 pm »
Bonjour à tous,
Alors voilà je voudrais faire une caméra freefly avec opengl et pour cela j'aurais besoin d'obtenir le mouvement relatif de la souris entre deux tours de la boucle principale. Ce qu'il m'aurait fallu c'est une méthode pour obtenir directement ces valeurs (comme on peut les avoir avec la SDL avec SDL_MouseMotionEvent::xrel et SDL_MouseMotionEvent::yrel)
Mais bon je n'ai pas trouvé donc essayé un truc du genre :

(...)
case Event::MouseMoved:
        int current_x = Mouse::getPosition(m_win).x, current_y = Mouse::getPosition(m_win).y;
        int elapsed_x = current_x - last_x, elapsed_y = current_y - last_y;
        last_x = current_x; last_y = current_y;
        if(elapsed_x != 0 || elapsed_y != 0)
        {
                cout << elapsed_x << "-" << elapsed_y << endl;
        }
        break;
(...)

Ça marche super bien, sauf qu'il y a un problème : lorsque la souris sort de la fenêtre ça ne marche plus (et c'est normal), du coup j'ai modifié et rajouté une ligne :

(...)
case Event::MouseMoved:
        int current_x = Mouse::getPosition(m_win).x, current_y = Mouse::getPosition(m_win).y;
        int elapsed_x = current_x - last_x, elapsed_y = current_y - last_y;
        last_x = current_x; last_y = current_y;
        if(elapsed_x != 0 || elapsed_y != 0)
        {
                cout << elapsed_x << "-" << elapsed_y << endl;
                Mouse::setPosition(Vector2i(320, 200), m_win); // <-- Ici la ligne rajoutée
        }
        break;
(...)

Et là ça ne marche pas ... enfin si mais pas vraiment ^^
Avec le code précédent (sans le setPosition), j'avais un bon "débit" de cout dans ma console (peut être 50 par secondes environ). Mais maintenant avec le setPosition je dois en avoir à peu près 4 par secondes du coup ça m'embête un peu, vous n'auriez pas une idée ?

Merci d'avance pour vos réponse :)

EDIT: Merde je viens de me rendre compte que je me suis trompé de forum dsl xD, si un admin pouvait déplacer ce topic dans le forum Fenêtrage je lui en serait reconnaissant, merci ^^
« Modifié: Septembre 24, 2012, 06:23:44 pm par chapa »

Samuel Proulx

  • Full Member
  • ***
  • Messages: 118
    • Voir le profil
Re : [SFML 2.0]Mouvement relatif de la souris
« Réponse #1 le: Septembre 08, 2012, 09:19:42 pm »
Ceci est vraiment simple en fait ;) Tu as compris qu'on va ramer le curseur au centre à chaque fois qu'on le bouge. Tu devrais donc prendre en considération que le last_mouse_pos est en fait le centre de la fenêtre, soit (320,200) selon ta ligne. La position actuelle va donc être comparé à la dernier position qui était (320,200).

Après, ça devrait bien fonctionner :)

ps. Cela pourrait occasionner un bug lorsque la souris quitte la fenêtre (c'est possible si la souris est bougée très rapidement et que la fenêtre n'est pas très grande. Il faut donc ajouter une ligne pour tenir compte si la souris ce trouve dans la fenêtre. Par exemple, quand la souris revient dans la fenêtre sur le bord, ton code va croire qu'elle a bougé de 320 pixels d'un coup alors que ce n'est pas vrai. Tu auras donc un booléen qui enregistra si la souris était à l'extérieur de la fenêtre lors de la dernière boucle, si c'est le cas, on téléporte la souris au centre sans affecter la caméra du déplacement.

G.

  • Hero Member
  • *****
  • Messages: 1558
    • Voir le profil
Re : [SFML 2.0]Mouvement relatif de la souris
« Réponse #2 le: Septembre 08, 2012, 10:43:24 pm »
J'ai fait y'a quelques temps une caméra de ce genre, et quand je vois que tu dis que ton code fonctionne, je m'interroge.
Quand j'utilise sf::Mouse::setPosition, un nouvel sf::Event::MouseMoved est déclenché. Je trouve ça pénible dans le cas présent, est-ce que c'est normal ? (avec la RC)
« Modifié: Septembre 08, 2012, 11:31:11 pm par G. »

Samuel Proulx

  • Full Member
  • ***
  • Messages: 118
    • Voir le profil
Re : [SFML 2.0]Mouvement relatif de la souris
« Réponse #3 le: Septembre 09, 2012, 04:14:11 am »
Moi, je ne peux pas répondre (je n'ai pas essayé et de plus j'utilise le snapshot). Par contre, si tu utilises ma solution, le Event::MouseMoved qui est déclenché sera ignoré avec ma méthode puisque (320,200) = (320,200), ce qui fera qu'on n'entrera pas dans la condition if(y != 0 || x != 0) et on ne réenclenchera pas un autre MouseMoved à cause du setPosition précédent.

chapa

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : [SFML 2.0]Mouvement relatif de la souris
« Réponse #4 le: Septembre 24, 2012, 06:22:44 pm »
Salut,
Merci pour vos réponses (que je vois un peu tardivement), mais après en avoir également discuté ici, j'en ai conclu que c'était du à l'implémentation de la SFML dans MacOS (oui j'avais pas précisé je n'en voyais pas l'intérêt ^^)
En effet en testant un même code sur mac et windows, ça marche parfaitement sur windows mais ça pose un problème de "débit" de cout sur mac c'est assez étrange...

Donc je marque quand même le sujet comme résolu, bien qu'il ne le soit pas vraiment
A+

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Messages: 4321
    • Voir le profil
    • E-mail
Re : [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
« Réponse #5 le: Septembre 25, 2012, 12:02:37 am »
Si tu penses qu'il y a vraiment un bug, essaye déjà de mettre à jour ta version de SFML depuis git et si ça persiste donne moi un code minimal et complet (en gros, une fonction main qui ne contient que le strict nécessaire pour reproduire le bug) en expliquant ce qui devrait se passer et se qui se passe en réalité. Comme ça j'aurais une chance de corrigé cet histoire.  ;)
SFML / OS X developer

chapa

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
« Réponse #6 le: Octobre 01, 2012, 06:59:07 pm »
Salut, alors j'ai eu quelques problèmes pour mettre à jour depuis git mais c'est bon ils sont résolus : avec Xcode 4.5 il faut bien penser à désactiver le C++11 dans les options de compilations sinon il y a des erreurs de linkage ;)
Enfin bref, ça n'a rien changer ça fait toujours la même chose, donc pour en revenir au bug, voilà le code minimal :
#include <iostream>
#include <SFML/Graphics.hpp>

using namespace std;
using namespace sf;

int main(int argc, char *argv[])
{
    RenderWindow window(VideoMode(200, 200), "SFML works!");
   
    while(window.isOpen())
    {
        Event event;
        while(window.pollEvent(event))
        {
            switch(event.type)
            {
                case Event::Closed:
                    window.close();
                    break;
                case Event::KeyReleased:
                    switch(event.key.code)
                    {
                        case Keyboard::Escape:
                            window.close();
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
                case Event::MouseMoved:
                    int current_x = Mouse::getPosition(window).x, current_y = Mouse::getPosition(window).y;
                    int elapsed_x = 100 - current_x, elapsed_y = 100 - current_y;
                   
                    if(elapsed_x != 0 || elapsed_y != 0)
                    {
                        cout << elapsed_x << "-" << elapsed_y << endl;
                        Mouse::setPosition(Vector2i(100, 100), window);
                    }
                    break;
            }
        }
       
        window.clear();
       
        window.display();
    }
   
    return 0;
}
Ce qu'il devrait se passer : un nombre de lignes assez important devraient s'écrire dans la console au bout de 1 secondes (par exemple)
Ce qu'il se passe : à peu près quatre lignes par secondes s'écrivent dans la console

J'espère que tu pourras trouver une solutions :)

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Messages: 4321
    • Voir le profil
    • E-mail
Re : [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
« Réponse #7 le: Octobre 01, 2012, 10:39:08 pm »
En effet, il semblerait qu'il y ait un truc qui cloche. Faudrait que je reteste sous Lion car en principe ça avait déjà été corrigé : https://github.com/SFML/SFML/issues/46 ... Peut-être une régression introduite par ML ?

Merci pour le rapport détaillé.
SFML / OS X developer

chapa

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
« Réponse #8 le: Octobre 02, 2012, 10:37:21 am »
De rien :)
Par contre je suis sur Lion je croyais l'avoir précisé mais en fait non dsl ^^