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 :

Problème event faisant clignoter


Sujet :

C

  1. #1
    Membre du Club Avatar de bricechris
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Points : 57
    Points
    57
    Par défaut Problème event faisant clignoter
    Bonjour,

    J'ai un petit problème assez embêtant : j'ai créé un petit prog tout simple où il suffit de faire un clic droit pour changer la couleur de l'écran. Le problème est que cela me fait clignoter mon écran lorsque le curseur est statique. Il faut alors que je le bouge pour que l'effet de clignotement disparaisse...

    Le clignotement est dû à la boucle qui tourne sans arrêt et qui réactive l'event "changement de couleur d'écran" à chaque tour, alors que cela devrait donc le faire que quand je fais un clic droit.

    Mon code source (allégé) :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
     
    int main(int argc, char *argv[])
    {
    	// variables
        SDL_Surface *ecran = NULL;
        SDL_Event event;
    	unsigned char encore=1, c=200, mode=1;
     
    	// initialisation
    	SDL_Init(SDL_INIT_VIDEO);
    	ecran = SDL_SetVideoMode(400, 300, 32, SDL_HWSURFACE);
    	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, c, c, c));
     
    	// boucle
    	while(encore){
    		SDL_Delay(40);
    		SDL_PollEvent(&event);
    		if(event.type == SDL_QUIT) encore=0;
     
    		// changement de mode
    		if(event.type == SDL_MOUSEBUTTONUP){
    			if(event.button.button == SDL_BUTTON_RIGHT){
    				if(mode) mode=0; else mode=1;
    				if(mode) c=100; else c=200;
    			}
    		}
     
    		// mise à jour ecran
    		SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, c, c, c));
    		SDL_Flip(ecran);
    	}
     
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    Je suis en PoolEvent et avec un delay de 40ms car j'ai des évènements redondants dans mon code complet : un personne avance vers mon curseur.

    Je n'arrive pas à corriger ce prob par moi-même. Pouvez-vous me donner un coup de main ?

    Merci,
    Chris.
    Méthode Bonaparte : méthode de gestion de classe pour profs lambda, leur permettant de réussir à avoir le calme dans leurs cours et le respect de leurs élèves. Sinon, un blog de citations sur l'école.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Le problème disparait-il si on teste le retour de SDL_PollEvent ?

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
     
    int main(int argc, char *argv[])
    {
    	// variables
        SDL_Surface *ecran = NULL;
        SDL_Event event;
    	unsigned char encore=1, c=200, mode=1;
     
    	// initialisation
    	SDL_Init(SDL_INIT_VIDEO);
    	ecran = SDL_SetVideoMode(400, 300, 32, SDL_HWSURFACE);
    	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, c, c, c));
     
    	// boucle
    	while(encore){
    		SDL_Delay(40);
    		if(1 == SDL_PollEvent(&event)) {
    			if(event.type == SDL_QUIT) encore=0;
     
    			// changement de mode
    			if(event.type == SDL_MOUSEBUTTONUP){
    				if(event.button.button == SDL_BUTTON_RIGHT){
    					if(mode) mode=0; else mode=1;
    					if(mode) c=100; else c=200;
    				}
    			}
     
    			// mise à jour ecran
    			SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, c, c, c));
    			SDL_Flip(ecran);
    		}
    	}
        SDL_Quit();
        return EXIT_SUCCESS;
    }

  3. #3
    Membre du Club Avatar de bricechris
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Points : 57
    Points
    57
    Par défaut
    Merci mabu, le problème disparait, mais en même temps, le petit personnage n'avance plus vers mon curseur lorsque ce dernier est statique. je ne l'ai pas mis dans le code source que j'ai donné, mais une image suit mon curseur jusqu'à ce qu'elle le touche. Or, pour marcher, elle a besoin d'un rafraîchissement très rapide.

    C'est assez gênant car je n'arrive pas à comprendre d'où vient mon problème initial. Pourquoi y-t-il une saccade de l'écran lorsque je clic droit alors que je ne bouge pas ?...
    Méthode Bonaparte : méthode de gestion de classe pour profs lambda, leur permettant de réussir à avoir le calme dans leurs cours et le respect de leurs élèves. Sinon, un blog de citations sur l'école.

  4. #4
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Il te faut une variable pour savoir si tu as cliqué ou pas. C'est un problème qui revient souvent.

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
     
    int main(int argc, char *argv[])
    {
      // variables
      SDL_Surface *ecran = NULL;
      SDL_Event event;
      unsigned char encore=1, c=200, mode=1;
      int clic = 0;
     
      // initialisation
      SDL_Init(SDL_INIT_VIDEO);
      ecran = SDL_SetVideoMode(400, 300, 32, SDL_HWSURFACE);
      SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, c, c, c));
     
      // boucle
      while(encore){
        SDL_Delay(40);
        while(SDL_PollEvent(&event));
        if(event.type == SDL_QUIT) encore=0;
     
        // changement de mode
        if(event.type == SDL_MOUSEBUTTONUP){
          if(event.button.button == SDL_BUTTON_RIGHT && clic){
            clic = 0;
            if(mode) mode=0; else mode=1;
            if(mode) c=100; else c=200;
          }
        }
        else if (event.type == SDL_MOUSEBUTTONDOWN) {
          if (event.button.button == SDL_BUTTON_RIGHT)
            clic = 1;
        }
     
        // mise à jour ecran
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, c, c, c));
        SDL_Flip(ecran);
      }
     
      SDL_Quit();
        return EXIT_SUCCESS;
    }
    Plus tu pédales moins fort, moins t'avances plus vite.

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        while(SDL_PollEvent(&event));
    Il manque pas un truc ? (C'est une vrai question, je n'utilise pas souvent SDL)

  6. #6
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Non.
    En fait c'est pour 'décharger' la pile d'event, sinon tu dépiles 1 event par iteration de ta boucle, du coup si tu as plein d'event (bouge la souris+clics rapides) tu vas saturer ta pile et ça va lagger.
    Plus tu pédales moins fort, moins t'avances plus vite.

  7. #7
    Membre du Club Avatar de bricechris
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Points : 57
    Points
    57
    Par défaut
    Merci Pouet_forever, le problème est presque effacé. En revanche, maintenant lorsque je clic droit avec la souris lorsqu'elle est mouvement, ça ne change pas de mode ! Il faut qu'elle soit statique pour que ça marche.

    Je n'ai pas encore eu le temps de consulter le cours sur le lien que tu m'as donné, par ailleurs. Cela dit, pour avoir appris le C grâce à celui-ci, je le connais plutôt bien.
    Méthode Bonaparte : méthode de gestion de classe pour profs lambda, leur permettant de réussir à avoir le calme dans leurs cours et le respect de leurs élèves. Sinon, un blog de citations sur l'école.

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

Discussions similaires

  1. problème event checkboxlist
    Par Kamishu dans le forum ASP.NET
    Réponses: 8
    Dernier message: 26/03/2017, 16h22
  2. Problème Event Paint
    Par Kropernic dans le forum VB.NET
    Réponses: 8
    Dernier message: 10/09/2013, 14h16
  3. Problème event Closing en mode OOB
    Par CRNice dans le forum Silverlight
    Réponses: 4
    Dernier message: 15/07/2010, 14h48
  4. [Problème Event MouseUp C++ Builder]
    Par Nuclear88 dans le forum C++Builder
    Réponses: 4
    Dernier message: 16/03/2010, 08h33
  5. problème event.keyCode Firefox
    Par Tdeny dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 05/07/2006, 17h48

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