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 :

Gestion de plusieurs boucles de PollEvent


Sujet :

SDL

  1. #1
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut Gestion de plusieurs boucles de PollEvent
    Hello;

    J'ai plusieurs boucles sur un PollEvent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ( SDL_PollEvent(&event){...}
    Dans une premiere boucle je gere les entrées pour le deplacement de sprite, comme indique dans la doc de SDL, j'ai un vecteur pour la vélocité au lieu de modifier pixel par pixel la position du sprite.

    Le probleme c'est que je doit avoir d'autres boucles sur un SDL_PollEvent (gestion des menus / sous menu).

    si la touche fleche_haut était dans l'état SDL_KEYDOWN dans la premiere boucle, la velocité du sprite en y est de -1, sur le relachement de la touche je place la velocité a 0.

    Mais si une deuxieme boucle est appelé entre l'appuye et le relachement de la touche, celle si sera toujours considérer comme appuyé.

    Il me faudrai un moyen d'en avertir SDL mais je n'ai pas la moindre idée de le faire...
    all your base are belong to us.

  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 : 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
    Tu ne peux pas. Tu fais une seule boucle et ensuite tu propages l'information au reste du programme.

    En fait, je mens... Tu pourrais utilise SDL_PushEvent mais je ne vois pas en quoi cela serait une bonne idée...

    Jc

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 111
    Points
    111
    Par défaut
    ne fais jamais aucune action dans une boucle d'evennement.
    tu 'set juste des variables' point barre.

    genre:
    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
     
    globale clavier[touche_max]
     
    boucle principale jeu:
     
    boucle events:
       clavier[touche_touchee] = nouvel_etat
    fin boucle
     
    ... // plus tard dans le code
    si (clavier[M] = enfoncee)
       Menu()
    si (clavier[Gauche] = enfoncee)
       VaAGauche()
    ...
    fin boucle principale jeu
     
    // definition de Menu():
    Menu()
    {
    boucle menu
       boucle events:
         clavier[touche] = nouvel etat
       fin boucle event
       si (clavier[bas] = enfoncee)
         DescendreCurseur()
       ...
    fin boucle menu
    }
    edit: aussi, tu pourrais aller dans les menu seulement au "key up" ca reglerais ton probleme.
    d'ailleurs, regarde bien dans toutes les interfaces pro, les actions sont prises en compte au "mouse up" quand tu click sur un bouton...

  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 Lightness1024 Voir le message
    ne fais jamais aucune action dans une boucle d'evennement.
    tu 'set juste des variables' point barre.
    Nous sommes d'accord dans le sens où tu veux sortir de la boucle le plus vite possible mais de là à dire ne fait pas d'action, je ne sais pas si je suis d'accord.

    Ton code avec tous les if sera plus lent au final que de l'avoir fait directement au moment du SDL_PollEvent. Je n'y vois pas beaucoup d'utilité dans la majeure partie des cas.

    Jc

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 111
    Points
    111
    Par défaut
    admettons
    en tout cas a priori une variable plus "globale" pour sauver l'état du clavier devrait déjà régler son problème.

    Mais bon quant aux 'if's, la lenteur sera rarement dû a du code qui branche deux fois, mais plutot a du bouclage/récusrivité sur trop d'éléments.
    en tout cas -> callgrind power.

  6. #6
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    je vais faire comme ca, de toute facon il ne peut etre que meilleur de decoupler en peu SDL avec les actions.
    all your base are belong to us.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2008
    Messages : 87
    Points : 111
    Points
    111
    Par défaut
    c'est pas génial car ton sampling (FPS) peut très bien ne pas intercepter un évenement en prenant des snapshots de temps en temps.
    l'avantage d'écouter les evenements est que tu es sûr de ne rien rater.
    j'ai encapsulé ca dans carnage engine 2, ca reglera son probleme

  8. #8
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    Hum ?

    Rater un evenement ???
    Je ne vois pas du tout de quoi tu veux parler.

    Les deux fonctions que j'ai cité recupere l'etat du clavier et de la souris a un moment donné. Il faut bien evidemment avoir prealablement placer un PollEvent ou WaitEvent, mais c'est fonction sont totalement operationnel.

    J'en use beaucoup, cela me simplifie la vie, et si c'est bien structuré, ca permet d'eviter des redondance vomitif de SDL_PollEvent ou SDL_WaitEvent.

  9. #9
    Membre actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Points : 263
    Points
    263
    Par défaut
    Après plusieurs essai, j'ai reussi avec la methode utilisant SDL_GetKeyState()
    Cepandant, il est certain que d'avoir plusieurs boucles est un problème (on peut effectivemet rater certains evenements, si l'on "emboite" les while SDL_PollEvent) C'est une solution idéale si l'application n'a pas été pensé dès le debut avec une seul boucle, mais à la longue cela n'apporte que des soucies !
    all your base are belong to us.

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

Discussions similaires

  1. Gestion de plusieurs langues
    Par emardjean dans le forum Langage
    Réponses: 2
    Dernier message: 09/04/2006, 18h50
  2. Pour Caféine - gestion de plusieurs photos
    Par le géologue dans le forum Access
    Réponses: 1
    Dernier message: 16/03/2006, 19h08
  3. Gestion de plusieurs couches d'affichage
    Par esteban63 dans le forum Windows
    Réponses: 2
    Dernier message: 08/03/2006, 21h21
  4. [FLASH MX] Gestion de Plusieurs Clips Identiques
    Par Darkdaemons dans le forum Flash
    Réponses: 2
    Dernier message: 18/01/2006, 19h06
  5. Réponses: 8
    Dernier message: 06/07/2004, 14h17

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