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 :

Désactiver les events pendant SDL_Delay


Sujet :

SDL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Désactiver les events pendant SDL_Delay
    Bonjour, je suis entrain de coder un jeu de rôle, et je rencontre un problème avec la gestion des évènements.
    En effet, pendant un SDL_Delay, il est prévu que tout le programme soit en pause, or il continue de stocker les touches attendues par les events si elles sont appuyés même pendant le SDL_Delay, et a la fin de celui ci elles sont appliqués. Exemple :

    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
    while ( *continuer )
    {
    SDL_WaitEvent(&event);
           switch(event.type) 
    {
                   case SDL_QUIT:
                                                                                                                            *continuer = 0;
                    break;
     
                            case SDL_KEYDOWN:
                                    switch(event.key.keysym.sym)
                                  {
                                             case SDLK_KP1:
     
                                                  //monter 
                                                   SDL_Delay( 1000 );
                                              break;
     
                                             case SDLK_KP2:
     
                                                  //descendre
                                                   SDL_Delay ( 1000 );
                                              break;
                                    }
                                 break;
                         }
    }
    Ici, si j'appuie sur "1" , le perso monte, le programme dort pendant 1 seconde, mais pendant cette seconde, si j'appuie 3* sur "2" par exemple a la fin de cette seconde le perso va aller 3* en bas.

    Je voudrais que les touches appuyés pendant le delay ne soient pas stockés et jamais exécutés.
    Est-ce possible ?

    Merci d'avance à vous.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Tu peux ajouter un SDL_FlushEvent à la fin de la boucle while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_FlushEvent(SDL_KEYDOWN);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je voudrais par curiosité pourquoi tu as besoin que la SDL ne stocke pas les events , je vois mal un type application qui n'en a pas besoin , pour faire un jeu c'est indispensable qu'il récupère les event pendant le Delay.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    merci, je vais essayer avec flushevent

    pourquoi ?
    Ben simplement parce que pour certaines animations le joueur ne doit pouvoir effectuer aucune action, le clavier ne doit pas répondre, et donc une fois l'animation et les delays finis, ce qu'il a pu taper comme touche pendant cette derniere ne doit pas etre executé.

    Tu as surrement joué à pokemon je pense, sur Gameboy.( pour exemple ) Il y a certains moment ou le joueur est spectateur, et peut importe sur quels touches il appuie, quand l'animation se termine et qu'il reprend contrôle du jeux, il fait pas 30 metres en avant parce qu'il a martelé la touche A pendant ce tout ce temps.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'aurais du préciser que je suis sur la SDL 1.2.x, et pas la 2.0, surrement pour ça que SDL_FlushEvent me met un " undefined reference to .... " à la compilation

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Au pire tu peux enlever tous les events en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(SDL_PollEvent(&event));
    Mais je doit dire que une telle manip m'échappe la

    Ben simplement parce que pour certaines animations le joueur ne doit pouvoir effectuer aucune action, le clavier ne doit pas répondre, et donc une fois l'animation et les delays finis, ce qu'il a pu taper comme touche pendant cette derniere ne doit pas etre executé.

    Tu as surrement joué à pokemon je pense, sur Gameboy.( pour exemple ) Il y a certains moment ou le joueur est spectateur, et peut importe sur quels touches il appuie, quand l'animation se termine et qu'il reprend contrôle du jeux, il fait pas 30 metres en avant parce qu'il a martelé la touche A pendant ce tout ce temps.
    Non ça c'est parce que tu t'y prend mal
    il faut faire une fonction event , puis gameplay , mais les évent (surtout pour un jeu) doivent être lu en "permanence".

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Trouvé !

    pour ceux que ça interesse, SDL_FlushEvent, qui supprime tous les events dans la file, peut etre remplacé avec SDL 1.2.x par :

    SDL_EventState(SDL_KEYDOWN, SDL_IGNORE);
    Tous les evenements de sont pas pris en compte ( vous tapez les touches dnas le vide )

    SDL_EventState(SDL_KEYDOWN, SDL_ENABLE);
    Reactive les evenements.

    ( remplacer SDL_KEYDOWN par le type d'evenements concerné )

    Merci !
    Bonne journée à vous.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/01/2005, 12h49
  2. Comment désactiver les actions automatiques de Windows ?
    Par j-phi dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 06/01/2005, 12h53
  3. Gérer les events d'un tableau de boutons
    Par lord_kalipsy dans le forum wxWidgets
    Réponses: 7
    Dernier message: 20/10/2004, 10h13
  4. désactiver les contraintes
    Par romainw dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 15/07/2004, 10h46
  5. Désactiver les touches F1, F2, F3, F4, F5 dans IE
    Par ZiZouJH dans le forum Flash
    Réponses: 7
    Dernier message: 17/02/2003, 09h59

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