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 :

SDL_PollEvent et détection de touche


Sujet :

SDL

  1. #1
    Membre à l'essai
    Lycéen
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Points : 18
    Points
    18
    Par défaut SDL_PollEvent et détection de touche
    Bonjour.

    Je programme un jeu avec les SDL et voici le problème. Je rafraichis l'écran tout les 55ms (soit 18 fois par seconde). J'ai donc mis un timer de 55ms dans ma boucle principale et je regarde si j'ai des evenements avec la fonction SDL_PollEvent. Le problème c'est que du coup quand j'appuie sur un touche il me compte parfois deux appuyes au lieux d'un (et cela sans même activier la répétition clavier). La seul solution que j'ai trouvé c'est de baisser le fps mais du coup je perd en fluidité.

    voci un extrait du code:
    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
    	 int tempsPrecedent = 0, tempsActuel = 0;
    
    	while(iContinuer)
    	{     
    
    		SDL_PollEvent(&event);
    		switch(event.type)
    		{
    			case SDL_QUIT:
    				iContinuer=0;
    				break;
    		    case SDL_KEYDOWN:
    			    switch(event.key.keysym.sym)
    				{
    					case SDLK_ESCAPE:
    						iContinuer=0;
    						break;
    
    					case SDLK_UP:
    						//mis a jour qui se produite trop de fois
    
    				}
    		}
    		tempsActuel = SDL_GetTicks();
    		if (tempsActuel - tempsPrecedent > (1000/FPS))
    		{	
                            //mis a jour
    			tempsPrecedent = tempsActuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
    		}
    		else 
    		{
    			SDL_Delay((1000/FPS) - (tempsActuel - tempsPrecedent));
    		}
    	}
    Quelq'un aurait il une solution?
    merci d'avance.

  2. #2
    Expert éminent sénior

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par mouteb
    (et cela sans même activier la répétition clavier).
    Cela n'est pas toujours désactivé par défaut.

    Par contre, un code source minimal, compilable qui expose le problème serait souhaitable.

    Jc

  3. #3
    Membre à l'essai
    Lycéen
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Points : 18
    Points
    18
    Par défaut
    Je viens de tester pour la répétition des touches (même si je met répétition à partir de 1s cela continue a fait le même problème) donc je ne pense pas que ça vienne de la.

    Je pense que le problème vient du fait que toutes les 55ms la boucle d'évenement est appellée or quand l'utilisateur appuie sur une touche clavier cela dure parfois plus de 55ms donc la fonction "deplacement" est appelé deux fois. Par exemple si j'appelle la boucle toute les seconde je n'ai plus ce problème.

    Voici le code détaillé et commenté :

    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
    	
    int iContinuer =i;
    //tant que iContinuer est a 1 on rafraichit toutes les 55ms et on gere les evenement
    while(iContinuer)
    	{
    
    		SDL_PollEvent(&event);
    		switch(event.type)
    		{
                                         //si c'est on veut fermer la fenetre on quitte
    			case SDL_QUIT:
    				iContinuer=0;
    				break;
                                 //si c'est un appuie sur une touche on regarde la quel s'est
    		    case SDL_KEYDOWN:
    			    switch(event.key.keysym.sym)
    				{
                                                                   //si c'est la touche UP on bouge le joueur une fois
    					case SDLK_UP:
    						joueur->Deplacement(0,-1,Jeu,ecran);
    
    						break;
    
    				}
    		}
    
    //ici la gestion du temps pour un rafraichissment toutes les 55 ms et géré les evenement toute les 55ms
    		tempsActuel = SDL_GetTicks();
    		if (tempsActuel - tempsPrecedent > (55))
    		{	
    			joueur->Deplacement(0,0,Jeu,ecran);
    
    			SDL_Flip(ecran);
    			tempsPrecedent = tempsActuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
    		}
    		else /* Si ça fait moins de 55ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
    		{
    			SDL_Delay(50) - (tempsActuel - tempsPrecedent));
    		}
    	}
    La fonction qui est appelé deux fois est donc : joueur->deplacement(...)

  4. #4
    Expert éminent sénior

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Il faut changer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		SDL_PollEvent(&event);
    		switch(event.type)
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(SDL_PollEvent(&event))
    {
    		switch(event.type)
                     ....
    }
    Jc

  5. #5
    Membre à l'essai
    Lycéen
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Points : 18
    Points
    18
    Par défaut
    ha merci génial ça a résoulu mon problème est en plus de ça je gagne en performence puisque la fonction SDL_PollEvent n'est plus appelé en permanance (soit presque 30% d'utilisation du processeur en moins).

    Merci beaucoup.

  6. #6
    Expert éminent sénior

    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 : 44
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par mouteb
    ha merci génial ça a résoulu mon problème est en plus de ça je gagne en performence puisque la fonction SDL_PollEvent n'est plus appelé en permanance (soit presque 30% d'utilisation du processeur en moins).

    Merci beaucoup.
    Hmmm, en principe le code que je t'ai filer fait fonctionner SDL_PollEvent encore plus.

    Par contre, le code dans la boucle interne sera moins souvent exécuté.

    Jc

  7. #7
    Membre à l'essai
    Lycéen
    Inscrit en
    Août 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2006
    Messages : 41
    Points : 18
    Points
    18
    Par défaut
    Justement j'ai laissé ma "temporisation" donc la fonction est toujours appellée toues les 55 ms mais la boucle interne n'est plus parcourue inutillement alors qu'avant toutes les 55ms tout était exécuté (c'est d'ailleur ça qui provoquait le problème)

    (Désolé j'ai encore du mal a trouver le bouton résolut, je suis mauvais élève...)

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

Discussions similaires

  1. Détection des touches
    Par Oberown dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/12/2010, 17h16
  2. Détection de touches
    Par nicotom dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 05/06/2009, 17h12
  3. Détection de touche
    Par babybell dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 18/05/2009, 15h45
  4. Détection de touches sans bloquer le programme
    Par DJ-sauron dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/11/2008, 10h52
  5. [D7] Détection de touche
    Par ericdelattre dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/09/2007, 17h09

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