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

SDL Discussion :

petit problème avec mousemotion


Sujet :

SDL

  1. #1
    Invité
    Invité(e)
    Par défaut petit problème avec mousemotion
    Dans cet après midi au temps si merveilleux.... je me suis mis vite fait sur un petit ecran de veille en SDL. Bon j'ai quelques problèmes (mais concernant windows) mais un concernant la SDL.

    Déjà, voici le code. Affichage plein écran, des points de toutes les couleurs qui s'affichent, c'est tout.
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    SDL_Surface *ecran = NULL;
     
    void initialisationSDL(void)
    {
        if (SDL_Init(SDL_INIT_VIDEO)== -1) /* Démarrage de la SDL. Si erreur alors... */
        {
            fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); /* Ecriture de l'erreur */
            exit(EXIT_FAILURE); /* On quitte le programme */
        }
        if( (ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN)) == NULL)
        {
     
            fprintf(stderr, "Impossible d'activer le mode graphique : %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
     
    }
     
     
    void dessineEtoile(void)
    {
        int R = (int)((double)rand() / ((double)RAND_MAX + 1) * 255);
        int G = (int)((double)rand() / ((double)RAND_MAX + 1) * 255);
        int B = (int)((double)rand() / ((double)RAND_MAX + 1) * 255);
        Uint32 coul = SDL_MapRGB(ecran->format, R, G, B);
        int X = (int)((double)rand() / ((double)RAND_MAX + 1) * 640);
        int Y = (int)((double)rand() / ((double)RAND_MAX + 1) * 480);
     
      *((Uint32*)(ecran->pixels) + X + Y * ecran->w) = coul;
    }
     
     
    void ecranVeille(void)
    {
        int continuer = 1;
        while(continuer)
        {
     
            dessineEtoile();
            SDL_Flip(ecran);
            SDL_Event event;
     
            SDL_PollEvent(&event);
            switch(event.type)
            {
               /* case SDL_MOUSEMOTION: */
                case SDL_KEYDOWN:
                case SDL_MOUSEBUTTONDOWN:
                case SDL_QUIT:
                    continuer = 0;
                    break;
     
                default:
                    break;
     
            }
        }
    }
     
    int main (int argc, char *argv[]) /* Je ne me souviens plus, la SDL autorise-t-elle le int main (void)? */
    {
     
        initialisationSDL();
        SDL_ShowCursor(SDL_DISABLE);
        ecranVeille();
        SDL_ShowCursor(SDL_ENABLE); /* Est-ce utile ? */
        SDL_Quit();
        return(EXIT_SUCCESS);
    }
    Le problème c'est que si je met SDL_MOUSEMOTION dans le switch, l'appli se lance et s'arrête de suite. Ce qui est dommage car j'aimerai arrêter l'appli avec le déplacement de la souris. Y'a t'il un moyen de faire ce que je veux, même avec un petit bidouillage ?
    J'ai déjà mis un SDL_Delay() avant ecranVeill(), mais sans resultat.

    Merci.

    (Sinon pour les problèmes windows au cas où, c'est quand je fais propriété affichage->Ecran de veille, chaque fois l'écran de veille se lance, y'a un moyen de gérer ça ?)

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Je ne suis pas sur, mais peut-etre le probleme vient du fait que quand tu lance l'écran de veille, ta sourie bouge ne serait-ce que d'un pixel et du coup sa quitte. Peut-etre pourrait tu empecher l'écran de veille de quitter avant disant 2 secondes, et ne quitter que si le déplacement de la sourie soit suffisemment important.

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par BruceBoc
    Je ne suis pas sur, mais peut-etre le probleme vient du fait que quand tu lance l'écran de veille, ta sourie bouge ne serait-ce que d'un pixel et du coup sa quitte. Peut-etre pourrait tu empecher l'écran de veille de quitter avant disant 2 secondes, et ne quitter que si le déplacement de la sourie soit suffisemment important.
    En effet, la solution de base est de mettre un timer qui lancera l'écran de veille pendant au moins 1 secondes et seulement après regardera si la souris bouge...

    Jc

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je dois m'y prendre comme un pied parce que ça ne marche pas mieux...

    j'ai testé deux méthodes :

    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
     
    int main (int argc, char *argv[])
    {
     
        initialisationSDL();
        SDL_ShowCursor(SDL_DISABLE);
        Uint32 temps_courant, temps_encours;
        temps_courant = SDL_GetTicks();
        do {
              temps_encours = SDL_GetTicks();
        } while(temps_encours < temps_courant +5000);
        ecranVeille();
        SDL_ShowCursor(SDL_ENABLE); /* Est-ce utile ? */
        SDL_Quit();
        return(EXIT_SUCCESS);
    }
    Seconde méthode (pas belle)


    Uint32 temps_courant, temps_encours; en global.
    et dans la fonction ecranVeille :

    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
    void ecranVeille(void)
    {
        int continuer = 1;
        if (temps_encours < temps_courant+5000)
            temps_encours = SDL_GetTicks();
        else
        {
            while (continuer)
            {
     
                dessineEtoile();
                SDL_Flip(ecran);
                SDL_Event event;
     
                SDL_PollEvent(&event);
                switch (event.type)
                {
     
                case SDL_KEYDOWN:
                case SDL_MOUSEBUTTONDOWN:
                case SDL_MOUSEMOTION:
                case SDL_QUIT:
                    continuer = 0;
                    break;
     
                default:
                    break;
     
                }
            }
        }
    }

  5. #5
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    voila comment tu peux t'y prendre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    activationDeLEcranDeVeille();
    /* on attend 2 secondes */
    Uint32 startTime = SDL_GetTicks();
    while(SDL_GetTicks() - startTime < 2000 ||  SDL_PollEvent(&event))
    {
      //On fait passer tous les evenements attendant sur la pile et on le les traites pas
    }
    /* Et maintenant on met le code normal pour la gestion des évènements */
    La manière la plus propre reste cependant la mise en place d'un EventFilter.

    Sinon, voici avec ton code ce que la solution d'avant donne:

    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
    void ecranVeille(void);
     
    int main(int argc, char **argv)
    {
      initialisationSDL();
      ecranVeille();
      SDL_Quit();
      return EXIT_SUCCESS;
    }
     
    void ecranVeille(void)
    {
      /* on prépare */
      SDL_ShowCursor(SDL_DISABLE);
      Uint32 startTime;
     
      int fini = 0;
      SDL_Event event;
     
      while (fini == 0)
      {
        /* Meme dans le temps du début il faut quand même pomper les évènements car ils restent sur la pile */
        while (SDL_PollEvent(&event) && SDL_GetTicks() - startTime < 2000)
        {
           switch(event.type)
           {
                case SDL_KEYDOWN:
                case SDL_MOUSEBUTTONDOWN:
                case SDL_MOUSEMOTION:
                case SDL_QUIT:
                    fini = 1;
                default:
                    break;
           }
        }
        dessineEtoile();
        SDL_Flip(ecran);
      }
      SDL_ShowCursor(SDL_ENABLE);
    }
    Ton erreur est de ne pas pomper les évènements quand le temps n'est pas écoulé: ils restent sur la pile et vont donc juste être reportés.

    de plus, dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SDL_Event event;
     
    SDL_PollEvent(&event);
     
    switch (event.type)
    A chaque boucle, tu recrées la variable event; il faudrait mieux la créer avant. Autrement, il faut tester le retour de SDL_PollEvent(&event) avant de faire un switch sur l'event.

  6. #6
    Invité
    Invité(e)
    Par défaut
    En ayant appliqué les modifs ça ne fonctionne toujours pas

    Soit ma souris optique a la tremblote... soit j'ai mal appliqué les modifs... Est-ce que cela fonctionne chez toi ?

    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
    void ecranVeille(void)
    {
        /* on prépare */
        SDL_ShowCursor(SDL_DISABLE);
        Uint32 startTime=SDL_GetTicks();
     
        int fini = 0;
        SDL_Event event;
     
        while (fini == 0)
        {
            /* Meme dans le temps du début il faut quand même pomper les évènements car ils restent sur la pile */
            while (SDL_PollEvent(&event) && SDL_GetTicks() - startTime < 5000)
            {
                switch (event.type)
                {
                case SDL_KEYDOWN:
                case SDL_MOUSEBUTTONDOWN:
                case SDL_MOUSEMOTION:
                case SDL_QUIT:
                    fini = 1;
                default:
                    break;
                }
            }
            dessineEtoile();
            SDL_Flip(ecran);
        }
        SDL_ShowCursor(SDL_ENABLE);
    }
     
    int main (int argc, char *argv[])
    {
     
        initialisationSDL();
        ecranVeille();
        SDL_Quit();
        return EXIT_SUCCESS;
    }

  7. #7
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Désolé c'est de ma faute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (SDL_PollEvent(&event) && SDL_GetTicks() - startTime < 5000)
    c'est pas ça

    c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (SDL_PollEvent(&event) && SDL_GetTicks() - startTime > 5000)
    J'ai fait une erreur de signe! ça promet pour le bac de math

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci à toi ça fonctionne à merveille... N'empêche que j'aurai pu voir cette petite faute... J'ai fait le boulet pour le coup

    Encore merci, et bon courage pour le bac

  9. #9
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par coyotte507

    [code]

    c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (SDL_PollEvent(&event) && SDL_GetTicks() - startTime > 5000)
    J'ai fait une erreur de signe! ça promet pour le bac de math
    Personnellement, je ferais un système qui ne gère simplement pas les SDL_MOUSEMOTION avant 5 secondes par exemple. Arrêter la gestion des autres n'est pas forcément intelligent. Je pense, par exemple, à SDL_QUIT.

    Jc

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

Discussions similaires

  1. Petits problèmes avec une CListCtrl
    Par vanitom dans le forum MFC
    Réponses: 2
    Dernier message: 17/11/2005, 11h45
  2. Un petit problème avec pop
    Par Paulinho dans le forum C++
    Réponses: 4
    Dernier message: 13/11/2005, 20h57
  3. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

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