les évennements

Le tutoriel en ligne vous pose quelques problèmes ? C'est ici pour en parler !

Messagede moi1392 le 28 Avr 2005 11:10

:langue: jaloux va !! moi je ne me plains pas des topics en anglais :non: !!!
Avatar de l’utilisateur
moi1392
Chocobo des mers profondes
Chocobo des mers profondes
 
Messages: 3986
Inscription: 27 Juin 2004 12:03
Localisation: chez wam

Re: OK donc la variable c mieux...

Messagede YuGiOhJCJ le 07 Avr 2006 17:52

YuGiOhJCJ a écrit:
moi1392 à dit:
Tu n'as donc pas besoin de ton "case SDL_KEYDOWN" car des que cet evenement arrivera, la seconde partie de ET sera fausse et donc tu sortiras du while :oui:
En fait, tu ne feras jamais les instructions contenues dans le case SDL_KEYDOWN


Donc c'est pour ça que j'ai choisi la solution de la variable, au moins la ça marche j'ai essayé:

Code: Tout sélectionner
while(SDL_WaitEvent(&event)){

      switch (event.type){
              case SDL_QUIT:   //Lorsque l'on ferme la fenêtre
               exit(0);
         break;

         case SDL_KEYDOWN:
                         printf("touche pressee : %d\n", event.key.keysym.sym);
                         sortieboucle = 1; //Retenir dans une variable que une touche a été appuyée
                         break;
                }

   if(sortieboucle == 1){  //Si une touche a été appuyée, sortir de la boucle while
                        break;
   }

}//FIN DE LA BOUCLE WHILE

sortieboucle = 0; //Réinitialisation de la variable pour une utilisation ultérieure de cette variable lors d'une nouvelle demande d'évennement

...


En fait j'ai trouvé une solution.
C'est avec les "switch" que je m'embettais maintenant j'utilise seulement des "if":
Code: Tout sélectionner
while(SDL_WaitEvent(&evenement)==1){
if(evenement.key.keysym.sym==SDLK_***){
...
break;
}
if(evenement.key.keysym.sym==SDLK_***){
...
break;
}
...
}//Fin de while

C'est beaucoup plus simple d'utilisation.
[yugiohjcj.free.fr]
Yu-Gi-Oh! Jeu de Cartes à Jouer
Avatar de l’utilisateur
YuGiOhJCJ
Bébé Chocobo
Bébé Chocobo
 
Messages: 121
Inscription: 22 Fév 2005 21:58
Localisation: Devant mon ordinateur en train de développer

Messagede moi1392 le 08 Avr 2006 00:14

pas besoin de break dans les if.

Par contre, c'est beaucoup moins optimisé car pour chaque évenement, il teste TOUS tes if !
Mets plutot des else if, mais même avec ça, le switch est plus performant, car il impose une serstriction, c'est que les différents "case" sont des CONSTANTES (il ne peuvent pas êtres variables comme dans le cas des if) et du coup il se permet de les indexer et il peut retrouver le bon dans un tableau trié en un temps log(n) alors que pour des if/else if, c'est n/2 la complexité ;)
Avatar de l’utilisateur
moi1392
Chocobo des mers profondes
Chocobo des mers profondes
 
Messages: 3986
Inscription: 27 Juin 2004 12:03
Localisation: chez wam

Messagede YuGiOhJCJ le 09 Avr 2006 12:41

moi1392 a écrit:pas besoin de break dans les if.

Par contre, c'est beaucoup moins optimisé car pour chaque évenement, il teste TOUS tes if !
Mets plutot des else if, mais même avec ça, le switch est plus performant, car il impose une serstriction, c'est que les différents "case" sont des CONSTANTES (il ne peuvent pas êtres variables comme dans le cas des if) et du coup il se permet de les indexer et il peut retrouver le bon dans un tableau trié en un temps log(n) alors que pour des if/else if, c'est n/2 la complexité ;)


Si justement ce que je voulais c'est pouvoir sortir de la boucle while. Avec les break, je peux ensuite continuer la suite du programme après la boucle while.
Tous les if sont testés...Je pense que l'utilisateur ne s'en rend pas compte :langue:
[yugiohjcj.free.fr]
Yu-Gi-Oh! Jeu de Cartes à Jouer
Avatar de l’utilisateur
YuGiOhJCJ
Bébé Chocobo
Bébé Chocobo
 
Messages: 121
Inscription: 22 Fév 2005 21:58
Localisation: Devant mon ordinateur en train de développer

Messagede moi1392 le 09 Avr 2006 19:25

non, l'utilisateur ne s'en rends pas compte, mais ce n'est pas "très joli" de faire un paquets de if avec un break pour sortir de la boucle englobante.

De toute façon, 'essentiel est que tu progresse, tu te rendras compte par toi même comment faire cela mieux plus tard !

C'est en codant qu'on apprends le mieux à coder ;)
Avatar de l’utilisateur
moi1392
Chocobo des mers profondes
Chocobo des mers profondes
 
Messages: 3986
Inscription: 27 Juin 2004 12:03
Localisation: chez wam

if obligé

Messagede YuGiOhJCJ le 09 Avr 2006 21:18

Ouais je suis d'accord avec toi c'était pour rire.
Mais comment veux-tu que je sorte de la boucle avec switch?
Quand je fais un break ça me sort seulement du switch et je reste dans la boucle du while. Il faut tout de même que j'inclue un if après, c'est la seule solution que je vois.
[yugiohjcj.free.fr]
Yu-Gi-Oh! Jeu de Cartes à Jouer
Avatar de l’utilisateur
YuGiOhJCJ
Bébé Chocobo
Bébé Chocobo
 
Messages: 121
Inscription: 22 Fév 2005 21:58
Localisation: Devant mon ordinateur en train de développer

Messagede moi1392 le 10 Avr 2006 11:40

si tu utilises SDL_PollEvent au lieu de SDL_WaitEvent, tu sortirais automatiquement car SDL_PollEvent revoie 0 s'il n'y a pas de message ;)

Le problème est que ton programme prendrait 100% des ressources, car il serait tout le temps en train de boucler sur SDL_PollEvent, alors qu'avec SDL_WaitEvent, le processus est mis en attente et réveillé par le kernel quand nu évenement se produit, c'est pour cela que tu as 0% d'utilisation du CPU quand tu ne fais rien (PS et c'est pour ça aussi que les jeux on tous 100% d'utilisation du CPU même s'il ne font rien, sont dans le menu ou minimisés)
Avatar de l’utilisateur
moi1392
Chocobo des mers profondes
Chocobo des mers profondes
 
Messages: 3986
Inscription: 27 Juin 2004 12:03
Localisation: chez wam

Messagede YuGiOhJCJ le 03 Juil 2006 08:14

Donc si SDL_PollEvent bouffe 100% de mon processeur...Utiliser une boucle while() revient au même...On reste dans une boucle infinie et ça bouffe des ressources...

Le truc c que si j'utilise SDL_PollEvent ça va passer à la suite s'il n'y a pas d'évenement. Or je veux rester à rien faire tant qu'il n'y a pas d'évenement et sortir quand l'évenement a été effectué pour passer à la suite du programme.
[yugiohjcj.free.fr]
Yu-Gi-Oh! Jeu de Cartes à Jouer
Avatar de l’utilisateur
YuGiOhJCJ
Bébé Chocobo
Bébé Chocobo
 
Messages: 121
Inscription: 22 Fév 2005 21:58
Localisation: Devant mon ordinateur en train de développer

Messagede moi1392 le 04 Juil 2006 10:08

oui mais en utilisant WaitEvent comme tu le fais, tu ne traite que le premier évenement, puisqu'après tu sors de la boucle et tu poursuis ton programme !

alors qu'une boucle sur PollEvent te trait tous les évents, car le résultat de la fonction est "vrai" (1) tant qu'il y a des évenements et "faux" (0) quand il n'y a plus d'évenements ! donc tu reste dans ton while tant que tu reçois un évenement, et quand tu les as tous traités, tu en sors car PollEvent te renvois 0. tu peux alors t'occuper de la suite de ton programme.
Et c'est exactement ce que tu souhaites faire (il me semble)

le truc pour ne pas aller "trop vite" est de ralentir l'exécution avec une petite boucle sur le temps (vois le tutorial sur le timer) qui te feras attendre avant de recommancer à traiter les évenements reçus.
Avatar de l’utilisateur
moi1392
Chocobo des mers profondes
Chocobo des mers profondes
 
Messages: 3986
Inscription: 27 Juin 2004 12:03
Localisation: chez wam

Précédent

Retourner vers Besoin d'aide en SDL ?

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités