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

Auteur Sujet: Langage C - Problème sur la position de la souris en SFML 1.6  (Lu 3400 fois)

0 Membres et 1 Invité sur ce sujet

CmoiPat

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
    • E-mail
Langage C - Problème sur la position de la souris en SFML 1.6
« le: Juillet 07, 2012, 04:50:04 pm »
Bonjour,

Je fais mes débuts sur la SFML 1.6 et je rencontre un problème sur le retour de position de la souris avec les fonctions MouseMove.X et MouseMove.Y  >:(

Mon objectif est simple, je veux juste remplacer le curseur de la souris par une image.

Lorsque je clic dans la fenêtre windows, je n'affiche plus le curseur et j'utilise un sprite pour afficher mon image aux coordonnées de la souris. Lorsque je reclic, le curseur revient. Jusque là tout va bien  :) sauf que  ???

Je ne sais pas pourquoi mais les coordonnées retournées par MouseMove.X et MouseMove.Y partent dans les choux au moment d'un clic sur n'importe quel bouton de la souris ou même lors de l'utilisation de la molette. Il suffit de bouger d'un poil la souris pour que les coordonnées redeviennent bonnes  :o

J'ai extrait le code qui met en évidence le phénomène :

#include <stdio.h>
#include <stdlib.h>
#include <SFML/Config.h>
#include <SFML/Graphics.h>

int main()
{
    int activation_deplacement = 0;

    //Création d'une fenêtre windows
    sfWindowSettings Settings = {24, 8, 0};
    sfVideoMode Mode = {1000, 1000, 32};
    sfRenderWindow* Fenetre;
    Fenetre = sfRenderWindow_Create(Mode, "Papier&Crayon", sfResize | sfClose, Settings);
    if (!Fenetre) return EXIT_FAILURE;


    //Création des images de la souris "mainOuverte" & "mainFermee"
    sfImage* mainOuverte;
    mainOuverte = sfImage_CreateFromFile("Images/Main_ouverte.png");
    if (!mainOuverte) return EXIT_FAILURE;
    sfImage_SetSmooth(mainOuverte,0);
    sfImage_CreateMaskFromColor(mainOuverte, sfColor_FromRGB(255, 255, 255), 0);

    sfSprite* Sprite_mainOuverte;
    Sprite_mainOuverte = sfSprite_Create();
    sfSprite_SetImage(Sprite_mainOuverte, mainOuverte);

    sfImage* mainFermee;
    mainFermee = sfImage_CreateFromFile("Images/Main_fermee.png");
    if (!mainFermee) return EXIT_FAILURE;
    sfImage_SetSmooth(mainFermee,0);
    sfImage_CreateMaskFromColor(mainFermee, sfColor_FromRGB(255, 255, 255), 0);

    sfSprite* Sprite_mainFermee;
    Sprite_mainFermee = sfSprite_Create();
    sfSprite_SetImage(Sprite_mainFermee, mainFermee);


    //Boucle pour les évènements de la fenêtre
    sfEvent Event;
    while (sfRenderWindow_IsOpened(Fenetre))
    {
        while (sfRenderWindow_GetEvent(Fenetre, &Event))
        {
            if (Event.Type == sfEvtClosed) sfRenderWindow_Close(Fenetre);
            if (Event.Type == sfEvtMouseButtonReleased)
            {
                if (Event.MouseButton.Button == sfButtonLeft)
                {
                        if (activation_deplacement == 1)
                        {
                            activation_deplacement = 0;
                            sfWindow_ShowMouseCursor(Fenetre, 1);
                        }
                        else activation_deplacement = 1;
                }
            }
        }

        /* Efface le contenu de la fenêtre */
        sfRenderWindow_Clear(Fenetre, sfColor_FromRGB(100, 100, 100));

        //Modifie le curseur de la souris
        if (activation_deplacement == 1)
        {
                //colle le sprite de la main ouverte
                sfWindow_ShowMouseCursor(Fenetre, 0);
                sfSprite_SetPosition(Sprite_mainOuverte, Event.MouseMove.X, Event.MouseMove.Y);
                sfRenderWindow_DrawSprite(Fenetre, Sprite_mainOuverte);
        }


        // Met à jour le contenu de la fenêtre (affichage)
        sfRenderWindow_Display(Fenetre);
    }

    sfSprite_Destroy(Sprite_mainOuverte);
    sfImage_Destroy(mainOuverte);

    sfSprite_Destroy(Sprite_mainFermee);
    sfImage_Destroy(mainFermee);

    sfRenderWindow_Destroy(Fenetre);

    return EXIT_SUCCESS;
}
 
Si vous avez des commentaires, des idées, un marteau... Je suis preneur.

Merci beaucoup

CmoiPat
« Modifié: Juillet 08, 2012, 12:23:20 pm par Laurent »

Starfighter

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : Langage C - Problème sur la position de la souris en SFML 1.6
« Réponse #1 le: Juillet 08, 2012, 11:03:07 am »
Bonjour,

Je vais peut-être dire une bêtise, mais si tu essayais de récupérer les coordonnées de la souris en utilisant deux variables au sein de la boucle d'évènements ça ne résoudrait pas le problème ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Langage C - Problème sur la position de la souris en SFML 1.6
« Réponse #2 le: Juillet 08, 2012, 12:25:09 pm »
C'est sfRenderWindow_GetEvent qui remplit les variables de type sfEvent. Si tu en utilises un en dehors de ta boucle d'évènements, il y a n'importe quoi dedans.

Il y a d'autres fonctions pour récupérer la position de la souris à n'importe quel moment (voir sfInput).
Laurent Gomila - SFML developer

CmoiPat

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
    • E-mail
Re : Langage C - Problème sur la position de la souris en SFML 1.6
« Réponse #3 le: Juillet 08, 2012, 08:40:39 pm »
Bonjour,

En effet Starfighter ce n'est pas une bêtise et Laurent confirme. Au sein de la boucle d'évènement le problème est le même (j'avais déjà essayé) mais en rajoutant une condition tout est bon (ça je ne l'avais pas fait   :-[):
if (Event.Type == sfEvtMouseMoved)
            {
                position_souris_X = Event.MouseMove.X;
                position_souris_Y = Event.MouseMove.Y;
            }
 
Et là, plus de problème  8)

Merci Laurent pour ta réponse, je ne sais pas pourquoi mais au vu de mon besoin, je trouvais que sfInput correspondait à de l'artillerie lourde.

Merci de m'avoir aiguillée.

CmoiPat