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 :

Mise en pause


Sujet :

SDL

  1. #1
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut Mise en pause
    Bonjour à tous,
    Je suis actuellement confronter à un problème que je ne comprend pas. Mon but étant ici de pouvoir mettre en pause une animation toute simple (une image qui traverse la fenêtre en diagonale).

    Voici le code de la boucle principale (où se situe le prob à mon avis) :
    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
     while(continuer)
        {
            SDL_PollEvent(&event) ;
            switch(event.type)
            {
                case SDL_QUIT :
                    continuer = 0 ;
                break ;
                case SDL_KEYDOWN :
                    if(event.key.keysym.sym == SDLK_p) 
                    {    
                        switch(enPause) 
                        {
                            case 0 :
                                enPause = 1 ;
                            break ;
                            case 1 :
                                enPause = 0 ;
                            break ;
                        }
                    }    
                break ;
            }
     
            if(!enPause)
            {
                if((positionZozor.y + zozor->h) >= 480)
                    versHaut = 1 ;
                else if(positionZozor.y <= 0)
                    versHaut = 0 ;                  
     
                tempsAct = SDL_GetTicks() ;
                if(tempsAct - tempsPrec > 20)
                {
                    tempsPrec = tempsAct ;                
                    if(versHaut)
                    {
                        positionZozor.x++ ;
                        positionZozor.y-- ;
                    }
                    else
                    {
                        positionZozor.x-- ;
                        positionZozor.y++ ;
                    }
                }
                else
                    SDL_Delay(20-(tempsAct-tempsPrec)) ;
            }
     
                SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255)) ;
                SDL_BlitSurface(zozor,NULL,ecran,&positionZozor) ;
                SDL_Flip(ecran) ;
        }
    Le problème est que la pause marche aléatoirement, en gros, le booléen en pause semble changer de valeur avant d'arriver à (!enPause).
    En gros j'appuie sur "p", défois le prog ce met en pause et défois pas, pareil pour enlever la pause.

    Bon je sais que c'est plutot confus comme explication alors n'hésitez pas à me demander des précisions.

    Merci d'avance pour vos réponses

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Lorsque tu appuies sur P, l'évènement SDL_KEYDOWN est généré en boucle jusqu'à ce que tu relâches. Si le nombre de frames écoulé est impair alors tu auras bien une pause, sinon non -- ce qui correspond au phénomène "aléatoire" que tu observes.

    Quant à la solution, cela dépend de SDL, je ne sais pas si elle permet de faire la distinction entre un évènement keydown et un évènement keypressed (c'est ce dernier que tu veux).

  3. #3
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Merci bcp laurent.
    Si j'utilise SDL_KEYUP à la place de SDL_KeyDown cela devrait résoudre le problème nan ?

    Edit : Ca marche pas, et la sur le coup, je comprend pas trop.

    Autant je peux comprendre que plusieur evènement KEYDOWN sont générés quand j'appuie, mais quand je relache, 1 seul évènement devrait être généré, nan ?

    Edit :
    Une solution envisageable , mais qui oblige à utiliser une autre touche que celle utiliser pour mettre en pause :
    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
    switch(event.type)
            {
                case SDL_QUIT :
                    continuer = 0 ;
                break ;
                case SDL_KEYUP :
                    if(event.key.keysym.sym == SDLK_p)
                    {     
                        enPause = 1 ;
     
                        while(enPause && continuer)
                        {
                            SDL_WaitEvent(&event) ;
                            switch(event.type)
                            {
                                case SDL_QUIT : 
                                    continuer = 0 ;
                                break ;
                                case SDL_KEYUP :
                                    if(event.key.keysym.sym == SDLK_o)
                                        enPause = 0 ;
                                break ;
                            }
                        }
                    }
                break ;
            }

  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 : 43
    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 Laurent Gomila
    Lorsque tu appuies sur P, l'évènement SDL_KEYDOWN est généré en boucle jusqu'à ce que tu relâches.
    Faux, enfin du moins sauf si on met systèmatiquement en place SDL_EnableKeyRepeat... Et je crois par défaut il est à faux (donc pas de répétitions)

    Voir la FAQ :
    http://jeux.developpez.com/faq/sdl/?...tition_touches

    L'erreur ici se trouve sur le fait que la réception des événements est mal faite...

    En effet, cela devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while(SDL_PollEvent(&event) )
    {
            switch(event.type)
            {
            ...
            }
    }
    Le fait de mettre le while autour permet de capter le résultat de la fonction SDL_PollEvent. Ce résultat disant s'il y a ou non un nouvel événement.

    En effet, s'il n'y a pas d'événements, le contenu de event est indéfini (en principe inchangé...)...

    Jc

  5. #5
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Merci à vous 2 pour vos réponses.
    En effet le keyRepeat n'était pas activer, voilà pourquoi je ne comprenais pas trop le fait que SDL_KEYDOWN serait répéter en boucle.

    Par contre tu as tout à fait raison FearYourself, il m'a suffit de faire un test sur la valeur de retour de SDL_PollEvent pour résoudre le problème, cependant étant donné qu'il s'agit d'une animation, le code de la boucle doit tout de même s'éxécuter qu'il y ai un évènement ou pas, d'où ma variante :

    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
     while(continuer)
        {
            if(SDL_PollEvent(&event))
            {
                switch(event.type)
                {
                    case SDL_QUIT :
                        continuer = 0 ;
                    break ;
                    case SDL_KEYDOWN :
                        if(event.key.keysym.sym == SDLK_p)
                            enPause = (enPause+1)%2 ;
                        break ;
                }
            }
     
            if(!enPause)
           {......
    Merci encore

  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 : 43
    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 MPKA
    d'où ma variante :

    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
     while(continuer)
        {
            if(SDL_PollEvent(&event))
            {
                switch(event.type)
                {
                    case SDL_QUIT :
                        continuer = 0 ;
                    break ;
                    case SDL_KEYDOWN :
                        if(event.key.keysym.sym == SDLK_p)
                            enPause = (enPause+1)%2 ;
                        break ;
                }
            }
     
            if(!enPause)
           {......
    Non, il faut mieux mettre un while comme je l'ai montré :



    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
     while(continuer)
        {
            while(SDL_PollEvent(&event))
            {
                switch(event.type)
                {
                    case SDL_QUIT :
                        continuer = 0 ;
                    break ;
                    case SDL_KEYDOWN :
                        if(event.key.keysym.sym == SDLK_p)
                            enPause = (enPause+1)%2 ;
                        break ;
                }
            }
     
            if(!enPause)
           {......
    Jc

  7. #7
    Membre du Club Avatar de Mic75
    Homme Profil pro
    Développeur Frontend
    Inscrit en
    Janvier 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Frontend
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Pourquoi 1 while est-il préférable qu'un simple if ?
    Est ce que s'est du au fait que event est à considérer comme une pile ?
    Le while permettrait de traiter tout les évènements de la pile ?

  8. #8
    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 : 43
    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 MPKA
    Pourquoi 1 while est-il préférable qu'un simple if ?
    Est ce que s'est du au fait que event est à considérer comme une pile ?
    Le while permettrait de traiter tout les évènements de la pile ?
    SDL_PollEvent remplit la structure event. Le problème est qu'entre deux itérations de ta boucle tu peux avoir plus de deux événements il faut donc effectivement tous les traiter.

    Un while le permet, un if non.

    Jc

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

Discussions similaires

  1. Mise en pause temporaire du projet
    Par dourouc05 dans le forum Bubuntu
    Réponses: 1
    Dernier message: 06/09/2011, 15h49
  2. Mise en pause d'un code pendant utilisation de UserForm
    Par ro31hg dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/04/2010, 15h17
  3. [VMWare][Mise en pause des ESX]
    Par Théolude dans le forum VMware
    Réponses: 1
    Dernier message: 24/07/2009, 10h22
  4. Thread problème de mise en pause dans des éléments Swing
    Par Balbuzard dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 25/08/2008, 09h54
  5. [C#] Mise en pause de l'affichage d'une Winform
    Par d1g-2-d1g dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/08/2006, 15h18

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