IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Déplacer la souris


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Points : 30
    Points
    30
    Par défaut Déplacer la souris
    Bonjour à tous

    Avec un ami on s'est lancé dans la création d'un petit jeu du genre imaze, on en est qu'au début, mais on rencontre déjà des problèmes ...

    Pour déplacer et orienter le point de vue du joueur on joue sur les paramètres de la fonction gluLookAt. Pour ce qui est des déplacement pas de soucis, par contre pour l'orientation il y a un hic. Voici comment on procède pour orienter le point de vue du joueur :

    On a crée une structure pour le joueur qui contient 2 vecteurs, l'un en coordonnées cartésiennes (qui représente sa position) et l'autre en coordonnées sphérique (qui représente son orientation).

    Pour rappel les coordonnées sphérique sont un jeu de coordonnées basé sur les angles : http://upload.wikimedia.org/wikipedi...oordinates.svg

    Quand la souris se déplace sur l'axe X alors on va modifier la valeur de théta, quand la souris se déplace sur l'axe Y alors on va modifier la valeur de phi. Puis on effectue un changement de coordonnées : sphérique => cartésiennes, de manière a pouvoir l'utiliser.

    PROBLEME : pour empêcher la souris de sortir de l'écran ou même d'atteindre les bord, on utilise la fonction :
    SDL_WarpMouse(LARGEUR_ECRAN/2, HAUTEUR_ECRAN/2);

    Ainsi elle se trouve toujours au centre de l'écran, on on peut toujours mesurer un déplacement. Malheureusement après avoir chronométrer la boucle principale, j'ai constaté qu'elle prenais pas mal de temps, pour optimiser j'ai posé des SDL_GetTicks() un peu partout pour savoir combien de temps prenait chaque fonction. Le temps maximal pour exécuter SDL_WarpMouse(LARGEUR_ECRAN/2, HAUTEUR_ECRAN/2); est de l'ordre de 20ms !!! C'est bien sur le cas extrême, mais 20ms ce n'est pas rien ! En gros cette fonction me limite a un maximum de 50fps ... alors vu qu'il y a des trucs en plus qui vont arriver ça risque de vite chuter ....

    Voila ma question après toutes ces explications :
    Existe-t-il un autre moyen simple et efficace de positionner la souris ? Peut importe la librairie.

    Merci d'avance

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Interessant problème ... encore lorsque c'est le SDL_WarpMouse() qui semble posé problème.
    Une solution que je propose, mais ce n'est pas multiplateforme, c'est de replacerle curseur avec la WinAPI. Vous trouverez la documentation dans la MSDN. Bien sur du coup ça fait du Windows seulement.

    Sinon, un jeu en plein écran, n'a pas besoin de replacer le curseur .

    Et finalement ( peut être mon idée la plus intelligente ), replacer votre souris que lorsque l'on touche un bord ... ou après un certain nombre de boucle, et non à chaque boucle de jeu.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Sinon, un jeu en plein écran, n'a pas besoin de replacer le curseur .
    En fait si, car si le curseur atteint le bord droit (par exemple) de la fenêtre ou de l'écran et qu'on continue a pousser la souris à droite, la position de la souris ne sera pas actualisé ou aura la même valeur, donc impossible de générer l'angle de rotation.

    Citation Envoyé par LittleWhite Voir le message
    Et finalement ( peut être mon idée la plus intelligente ), replacer votre souris que lorsque l'on touche un bord ... ou après un certain nombre de boucle, et non à chaque boucle de jeu.
    C'est une bonne idée, mais la tout de suite je ne vois pas comment faire...

    Car si je me base sur la position relative de la souris, lorsque je vais la replacer au centre de l'écran SDL_WarpMouse va générer un événement qui perturbera la valeur de l'angle de rotation. En gros une fois arrivé au bord droit de l'écran (admettons 640x480), on va replacer la souris et sa position relative sera -320 alors qu'on l'a poussé sur la droite ...

    Si je me base sur la position absolue de la souris, une fois déplacer du centre de l'écran un angle de rotation sera toujours généré, même si la souris ne bouge plus, c'est pour ça que je suis obligé de la remettre au centre après avoir générer l'angle.

    Si t'as une idée de comment arriver à faire marcher l'une ou l'autre méthode je suis preneur.

    EDIT : portable c'est mieux

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Pour du code portable, on va rester avec celui de la SDL, c'est ce qu'il y a de mieux je pense ).

    Bon, c'est vrai que je n'ai pas expliqué tout les détails de l'implémentation à faire ( Peut être que je n'avais pas compris toutes les contraintes ).
    Disons, nous allons faire en sorte, de replacer notre curseur à chaque fois que nous atteignons un bord.
    En fait, ce qu'il faut faire, c'est que pour chaque update du jeu, on regarde la position de la souris.
    On fait la différence entre la position actuelle de la souris, et la position précédente de la souris. Avec la différence, nous mettons à jour notre angle ... et tout ce que vous voulez mettre à jour
    On sauvegarde la position de la souris ( qui devient donc position précédente ).

    Maintenant, pour le cas ou l'on touche un bord
    On replace notre curseur au centre, et directement, nous mettons l'ancienne position du curseur à zero ( enfin, au coordonnées du centre). Et hop, l'ordinateur n'a vu que du feu et on peut continuer à bouger la souris dans tout les sens.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    Merci pour tes réponses, je vais tester ça.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2009
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 48
    Points : 30
    Points
    30
    Par défaut
    En fait ce n'est pas aussi simple qu'il n'y parait, car il y a un truc auquel on a pas pensé : la souris n'est pas actualisé en continue ! Il faut donc être sur de capter le moment ou elle atteint le bord de l'écran.

    Dans le cas d'un jeu en fullscreen pas de soucis la souris n'ira pas plus loin, mais dans le cas d'un jeu en mode fenêtré la souris peut très bien sortir de la fenêtre sans que sa position soit égale à l'un des bord.

    Si jamais il y a des personnes qui rencontre le même problème que moi, voici un petit bout de code qui pourrait peut être les aider :

    Voici la mise à jour des évenements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    struct Structure_Evenement
    {
    	int clavier[SDLK_LAST];
    	int boutons_souris[6];
    	int position_sourisX, position_precedente_sourisX, position_sourisY, position_precedente_sourisY,
    	position_relative_sourisX, position_relative_sourisY;
    	int quit;
    };
     
    void maj_evenements (struct Structure_Evenement *Input)
    {
    	Input->position_precedente_sourisX = Input->position_sourisX;
    	Input->position_precedente_sourisY = Input->position_sourisY;
     
    	SDL_Event event;
     
    	while(SDL_PollEvent(&event))
    	{
    		switch(event.type)
    		{
    			case SDL_KEYDOWN:
    			  Input->clavier[event.key.keysym.sym] = 1;
    			  break;
     
    			case SDL_KEYUP:
    			  Input->clavier[event.key.keysym.sym] = 0;
    			  break;
     
    			case SDL_MOUSEMOTION:
    			  Input->position_sourisX = event.motion.x;
    			  Input->position_sourisY = event.motion.y;
    			  Input->position_relative_sourisX = event.motion.xrel;
    			  Input->position_relative_sourisY = event.motion.yrel;
    			  break;
     
    			case SDL_MOUSEBUTTONDOWN:
    			  Input->boutons_souris[event.button.button - 1] = 1;
    			  break;
     
    			case SDL_MOUSEBUTTONUP:
    			  Input->boutons_souris[event.button.button - 1] = 0;
    			  break;
     
    			case SDL_QUIT:
    			  Input->quit = 1;
    			  break;
     
    			default:
    			  break;
    		}
    	}
    }
    les conditions sur la souris sur l'axe X (pour l'axe Y c'est exactement la même chose il y a juste a remplacer X par Y dans les conditions):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	if(Evenements->position_sourisX != Evenements->position_precedente_sourisX)
    	{
    		rotation_theta_joueur(Joueur, (Evenements->position_precedente_sourisX - Evenements->position_sourisX) * vitesse_de_rotation);
    		if(Evenements->position_sourisX >= LARGEUR_ECRAN - limite_souris || Evenements->position_sourisX <= limite_souris)
    		{
    			SDL_WarpMouse(LARGEUR_ECRAN/2, HAUTEUR_ECRAN/2);
    			Evenements->position_sourisX = LARGEUR_ECRAN/2;
    			Evenements->position_precedente_sourisX = Evenements->position_sourisX;
     
    			Evenements->position_sourisY = HAUTEUR_ECRAN/2;
    			Evenements->position_precedente_sourisY = Evenements->position_sourisY;
    		}
    	}
    et il ne faut pas oublier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_WM_GrabInput(SDL_GRAB_ON);
    qui permet de garder la souris à l'intérieur de la fenêtre.

    Dernier petit commentaire, vous pouvez voir dans les conditions liées à la souris une variable appelé : limite_souris, en fait en empêchant la souris de sortir de la fenêtre elle n'atteint jamais les bords, d'après le test rapide que j'ai fais limite_souris = 1 est suffisant pour déclencher la condition correctement.

    Merci encore à toi LittleWhite

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBS]Déplacer la souris
    Par spidey89 dans le forum VBScript
    Réponses: 9
    Dernier message: 17/10/2010, 19h08
  2. Déplacer une souris en VBA
    Par riri2938 dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/02/2009, 16h26
  3. [paint] se déplacer sans souris
    Par afrodje dans le forum Imagerie
    Réponses: 0
    Dernier message: 04/02/2008, 15h02
  4. [Choix langage] Utiliser/Déplacer la souris/clavier
    Par Mindless dans le forum Windows
    Réponses: 5
    Dernier message: 22/01/2008, 10h13
  5. [VBA-E]Déplacer la souris
    Par koc kenan dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 09/04/2006, 22h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo