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 :

[C] Probléme avec une procédure


Sujet :

SDL

  1. #1
    Membre averti
    Avatar de Sieldev
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 259
    Points : 353
    Points
    353
    Par défaut [C] Probléme avec une procédure
    Salut,

    Lors d'un evenement, j'appelle une procédure nommée pause() cependant à l'appel de cette procédure mon programme plante.

    Tout d'abord dans le programme principale je détermine des evenements au clavier:

    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
     while(continuer == 1)
        {
            SDL_PollEvent(&evenement);
     
            switch(evenement.type)
            {
                case SDL_QUIT:
                        continuer = 0;
                break;
     
                case SDL_KEYDOWN:
                        switch(evenement.key.keysym.sym)
                        {
                            case SDLK_ESCAPE:
                                    continuer = 0;
                            break;
     
                            [...]
     
                            case SDLK_p:
                                    pause(); //Lorsque l'utilisateur appuie sur le touche 'p', la procédure pause est appelée
                            break;
                        }
     
                break;
            }
    Voila la procédure 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
    void pause()
    {
        int pause = 1;
        SDL_Event toucheP; //Déclaration d'un evenement
     
        while(pause == 1)
        {
            SDL_WaitEvent(&toucheP);//Tant qu'il n' y a pas d'evenement tu ne fais rien
            switch(toucheP.type)
            {
                case SDL_KEYDOWN:
                        switch(toucheP.key.keysym.sym)
                        {
                            SDLK_p:
                                pause = 0; //Si l'utilisateur appuie sur la touche 'p', pause reçoit 0 pour ne pas ré-entrer dans la boucle
                            break;
                        }
                break;
            }
     
        }
     
    }
    Donc mon programme tourne correctement et quand j'appuie sur la touche 'p' le programme se met en pause, par contre aprés quand je réappuie sur la touche 'p' sa plante.
    L' IDE ne me renvoie aucun message d'erreur particulier.
    Je pense que le probléme vient de ma procédure pause(), plus précisement lors de l'évenement mais je ne vois pas pourquoi ca ne marche pas.

    En espérant que vous pouvez m'aider.

    Cordialement Sieldev,

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Il y a un point-virgule au while de ta fonction pause(), cela donne une boucle infinie.

    Un compilo bien réglé aurait du te le signaler (il me semble que GCC le fait, pour Visual j'ai un doute...)

  3. #3
    Membre averti
    Avatar de Sieldev
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 259
    Points : 353
    Points
    353
    Par défaut
    Oui en effet, merci. J'ai edité mon message précédent pour enlever le point-virgule.
    L' IDE que j'utilise est Code::Block.

    Pour que vous visualisez mieux le probléme, mon programme fait simplement avancer un point sur l'ecran. Et donc quand l'utilisateur appuie sur 'p' je veux mettre en pause le programme, figeant ainsi le point.

    Ca ne marche toujours pas mais il y a une petite évolution.
    Quand j' appuie sur 'p' le programme se met en pause mais quand je ré-appuie sur 'p', le point avance et s'arrete aussitot, comme s' il se remettait sur pause.

    J'ai donc cru que en appuyant sur 'p' pour sortir de la boucle de la procédure pause(), cela ré-appeler la procédure dans le programme principale. J'ai donc changé la touche pour sortir de la boucle dans la procédure pause(), en mettant par exemple la touche o (SDLK_o), mais ca fait la même chose.

    Je ne vois pas ou est le probléme.

  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 tester le retour des fonctions SDL_PollEvent/SDL_WaitEvent. Ton problème vient de là.

    Par contre, c'est une mauvaise idée de mettre deux codes de gestion d'événements. Il faut en mettre une centrale qui ne gére pas de la même facon le programme s'il est en pause ou non.

    Jc

  5. #5
    Membre averti
    Avatar de Sieldev
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 259
    Points : 353
    Points
    353
    Par défaut
    D'accord, en envoyant l'adresse de ma variable "evenement" (dans mon programme principal) en paramétre de la procédure ca peut le faire?

  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 Sieldev Voir le message
    D'accord, en envoyant l'adresse de ma variable "evenement" (dans mon programme principal) en paramétre de la procédure ca peut le faire?
    Je ne comprends pas ce que tu sous-entendant. Ecris le code et montre le.

    Si ce que tu veux dire c'est avoir une fonction qui gére les événements et dépendant de l'état du programme (en pause on aura une fonction gestionPause et lorsque le programme n'est pas en pause on aura une fonction gestionDeroule) envoit l'évnénement à la fonction gestionPause ou gestionDeroule, alors la réponse est oui

    Jc

  7. #7
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 529
    Points : 5 203
    Points
    5 203
    Par défaut
    tu pourrais gérer un système d'état pour indiquer si ton programme est en train de tourner ou est en pause

    si tu gères le déplacement de ton point en fonction du temps passé, tu peux aussi mettre en pause en utilisant un facteur sur le calcul du temps
    avec un facteur à 1 ton programme tourne normalement, à 0 il n'avance plus et à 2 tu pourrais l'accélérer, etc...

    il y a pas mal de méthodes plus ou mons bonnes mais comme fear je ne trouve pas très judicieux d'avoir 2 boucle de gestion des événements comme tu l'as fait

  8. #8
    Membre averti
    Avatar de Sieldev
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 259
    Points : 353
    Points
    353
    Par défaut
    Salut,

    En fait j'ai fais d' une autre maniére, dans mon programme j'avais une variable de type caractére "direction" qui indiquait le sens des fléches du clavier.
    Je l'ai tout simplement utilisez pour lui affecter 'p' puis je l'ai appliqué dans une condition qui appele les fonctions qui deplacent les points.
    J' en remercie mon prof qui m'a insuflé cette idée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     case SDLK_p:
     direction = 'p';
     testPause = 1;
    break;
    Et puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     if(direction != 'p');
    {
           deplacerSerpent(direction, &serpPosition[0]);
     
    }
     
     if(testPause == 0)
    {
            deplacerCorps(serpPosition, nbCarre);
    }

  9. #9
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Si tu veux savoir d'où venait ton problème c'était ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     while(continuer == 1)
        {
            SDL_PollEvent(&evenement);
     
            switch(evenement.type)
            {
              ...
            }
         }
    il aurait fallu faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     while(continuer == 1)
        {
            if (SDL_PollEvent(&evenement) != 0);
            {
              switch(evenement.type)
              {
                ...
              }
            }
         }
    C'est une erreur classique. S'il n'y a pas de nouvel event, SDL_PollEvent va te laisser ton event inchangé et donc si tu ne testes pas la valeur de retour, ton programme va croire qu'on a encore appuyé sur la touche p.

  10. #10
    Membre averti
    Avatar de Sieldev
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 259
    Points : 353
    Points
    353
    Par défaut
    D'accord merci beaucoup

  11. #11
    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 vaut mieux faire un while qu'un if, histoire de vider tous les événements en attente à chaque itération.

    Jc

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

Discussions similaires

  1. Problème avec une procédure
    Par Thomad dans le forum SQL
    Réponses: 9
    Dernier message: 24/09/2007, 15h07
  2. Petit problème avec une procédure stockée
    Par Poulain dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/05/2007, 18h58
  3. [VB.NET 2.0] - Problème avec une procédure stockée
    Par Khrysby dans le forum Accès aux données
    Réponses: 1
    Dernier message: 14/05/2007, 15h25
  4. problème avec une procédure recursive
    Par vbcasimir dans le forum SQL
    Réponses: 1
    Dernier message: 10/06/2005, 16h38
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33

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