Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: chapa le Septembre 05, 2012, 05:02:57 pm

Titre: [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
Posté par: chapa 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 ^^
Titre: Re : [SFML 2.0]Mouvement relatif de la souris
Posté par: Samuel Proulx 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.
Titre: Re : [SFML 2.0]Mouvement relatif de la souris
Posté par: G. 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)
Titre: Re : [SFML 2.0]Mouvement relatif de la souris
Posté par: Samuel Proulx 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.
Titre: Re : [SFML 2.0]Mouvement relatif de la souris
Posté par: chapa 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 (http://"http://www.siteduzero.com/forum-83-801602-p1-sfml-2-0-obtenir-le-mouvement-relatif-de-la-souris.html"), 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 (http://"http://www.siteduzero.com/forum-83-801602-p1-sfml-2-0-obtenir-le-mouvement-relatif-de-la-souris.html#r7693171") 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+
Titre: Re : [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
Posté par: Hiura 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.  ;)
Titre: Re : [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
Posté par: chapa 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 :)
Titre: Re : [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
Posté par: Hiura 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é.
Titre: Re : [Résolu (ou pas)][SFML 2.0]Mouvement relatif de la souris
Posté par: chapa 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 ^^