les évennements

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

les évennements

Messagede YuGiOhJCJ le 26 Fév 2005 18:15

Salut à tous,
je sais que pour un evennement, on procède ainsi:

Code: Tout sélectionner
while(SDL_WaitEvent(&event)){ //Attendre jusqu'à ce que
      switch (event.type){
              case SDL_QUIT:   //L'on ferme la fenêtre
               exit(0);
         break;
      }
      switch (event.key.keysym.sym){
         case SDLK_ESCAPE:  //L'on appuie sur ECHAP
         exit(0);
         break;
      }
   }


Mais si je veux que ce soit lorsqu'on appuie sur la touche "A" ou sur la touche "1" du pavé numérique du clavier à quoi ça correspondera en langage SDL?

J'aimerai bien avoir une liste de ce style:
SDLK_*** Pour la touche "A"
SDLK_*** Pour la touche "B"
SDLK_*** Pour la touche "C"
...
Quelqu'un l'aurait?
Merci beaucoup!
[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 26 Fév 2005 22:38

va voir dans le fichier SDL_keysym.h ( qui est dans /usr/include/SDL par défaut ) tu y trouveras la liste des différents SDLK_*
Par contre, si tu ne trouves pas la touches que tu cherches, il n'y a qu'une méthode : le test !!

dans le case SDL_KEYDOWN, tu fais un printf() sur le keysym...
Avatar de l’utilisateur
moi1392
Chocobo des mers profondes
Chocobo des mers profondes
 
Messages: 3986
Inscription: 27 Juin 2004 12:03
Localisation: chez wam

pas comme ça?

Messagede YuGiOhJCJ le 19 Mar 2005 15:43

J'ai essayé comme ça:
Code: Tout sélectionner
printf("%s", SDL_KEYDOWN);


Mais ça marche pas:
"Fatal signal: Segmentation Fault (SDL Parachute Deployed)"

Tu peux me dire quelle ligne entrer exactement pour que ça affiche toutes les possibilités à l'écran?
Merci.
[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 20 Mar 2005 23:04

ta boucle d'évenements est fausse !!

regardes bien dans le troisième tutorial... on procède ainsi :

Code: Tout sélectionner
   while (SDL_WaitEvent(&event))
   {
      switch (event.type)
      {
                case SDL_QUIT:   //L'on ferme la fenêtre
                     SDL_quit();
                     exit(0);
                     break;

      case SDL_KEYDOWN:
                      printf("touche pressee : %d\n", event.key.keysym.sym);
                      break;
                }
        }


Voila à peu de choses près... toi tu oublies de quitter SDL avant ton exit (il faut aussi liberer tout ce que tu as initialiser ou créé)
De plus, les evenements de réception du clavier sont dans le MEME switch !!! Si on apelle ca LA boucle dévenements, c'est qu'il n'y en a qu'UNE !

Voila, avec ca tu verras s'afficher le code des touches qui sont pressées, il ne te resteras plus qu'à aller chercher dans le fichier que je t'ai donné dans mon précedent post pour faire la correspondance avec les SDLK_*
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 Mateooo le 21 Mar 2005 15:50

:goutte: :goutte: :goutte: :( :( :( snif snif snif
Comprends riennn...
Mateooo
 

Messagede YuGiOhJCJ le 25 Mar 2005 19:18

OK merci je vais essayer ça ;-)
Eheh ya des noobs de la programmation. Faut s'y mettre les gars c'est pas si difficile.
lol
[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

...des n°

Messagede YuGiOhJCJ le 27 Mar 2005 11:00

voilà j'ai essayé et ça me donne des chiffres quand je tape une touche:

Code: Tout sélectionner
touche pressee : 110
touche pressee : 103
touche pressee : 117
touche pressee : 100
touche pressee : 99
touche pressee : 108
touche pressee : 113


Pourtant, normalement ce sont des lettres...par exemple:
ESCAPE
qui correspond à la touche Echap.

Alors comment retrouver ces noms?
Ou alors comment exploiter ces chiffres ensuite dans mon programme?
(SDLK_99 marcherait?)
[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 28 Mar 2005 23:18

extrait du fichier SDL_keysym.h :

Code: Tout sélectionner

...

        SDLK_a                  = 97,
        SDLK_b                  = 98,
        SDLK_c                  = 99,
        SDLK_d                  = 100,
        SDLK_e                  = 101,
        SDLK_f                  = 102,
        SDLK_g                  = 103,
        SDLK_h                  = 104,
        SDLK_i                  = 105,
        SDLK_j                  = 106,
        SDLK_k                  = 107,
        SDLK_l                  = 108,
        SDLK_m                  = 109,
        SDLK_n                  = 110,
        SDLK_o                  = 111,
        SDLK_p                  = 112,
        SDLK_q                  = 113,
        SDLK_r                  = 114,

...



quand tu as ton numéro, tu le cherches à droite d'un "=" dans le fichier, et à gauche du même "=" tu as le SDLK_xxx correspondant !!
Avatar de l’utilisateur
moi1392
Chocobo des mers profondes
Chocobo des mers profondes
 
Messages: 3986
Inscription: 27 Juin 2004 12:03
Localisation: chez wam

Merci...

Messagede YuGiOhJCJ le 31 Mar 2005 16:55

Merci je vais essayer.
Merci de m'en avoir montré quelques uns maintenant je sais que pour la touche A c'est SDLK_a.
[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 Avr 2005 16:13

n'hésites pas à ouvrir les fichiers ".h" pour voir ce qu'il y a dedans.

Généralement, tu les trouve dans /usr/include et après il y a un dossier spécial pour chaque librairie : /usr/include/SDL pour SDL, /usr/include/GL pour openGL, ...

cherche ton include avec un find dans /usr/include et ouvres le pour voir ce qu'il y a dedans, c'est souvent commenté et on y apprends des tas de choses !!
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 23 Avr 2005 23:11

Re ;)
Bon voici un code tout simple:
Code: Tout sélectionner
   while(SDL_WaitEvent(&event)){
      switch (event.type){
              case SDL_QUIT:   //Lorsque l'on ferme la fenêtre
               printf("1");
         break;

         case SDL_KEYDOWN:
                         printf("touche pressee : %d\n", event.key.keysym.sym);
                         break;
                }
   }


Le truc que j'ai fait c'est que lorsqu'on ferme la fenêtre, au lieu de quitter le programme, ça affiche "1" dans la console. C'était un test pour vérifier ce qui se passait exactement quand je cliquais sur l'icone "X" en haut à droite de la fenêtre.

Et là surprise, quand je clique sur le "X" pour fermer ma fenêtre, rien ne s'affiche dans la console texte. Pourtant, lorsque j'appuie sur une touche de mon clavier, ça affiche bien "touche pressee : ***".

Pourquoi "1" ne s'affiche pas quand je clique sur "X" de ma fenêtre SDL?
[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 YuGiOhJCJ le 23 Avr 2005 23:26

Autre question:
Dans le programme précédent, j'utilise la boucle:

Code: Tout sélectionner
while(SDL_WaitEvent(&event))
{
//Ici on met les evennements
}


Et donc infiniment, on reste dans cette boucle même après qu'un évennement ai été réalisé. Mais moi je voudrai sortir du cette boucle while et continuer le programme après que l'évennement ai été effectué.

Mais retirer la boucle while ferait que ça n'attenderai pas l'appui d'une touche de l'utilisateur et ça passerai tout de suite après...

Alors j'ai pensé à une variable qui a une ceratine valeur quand l'action a été effectuée:

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

...



Mais c'est dommage de créer une variable juste pour vérifier cela...N'y a t'il pas une autre solution qui te vient à l'ésprit pour attendre qu'un évennement soit effectué par l'utilisateur du programme SDL pour passer à la suite du programme?(en utilisant d'autres types de boucles que WHILE par exemple)
[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 23 Avr 2005 23:30

C'est bizzarre en effet... est ce que tu pourrais copier tout le source dans ton prochain post.. je le recopierai et j'essairai de voir pour te répondre... merci :)

pour ton second problème, la réponse et facile :

Code: Tout sélectionner
while ( SDL_WaitEvent(&event) && event.type != SDL_KEYDOWN  )
    ;


n'oublie pas non plus que tu as la fonction SDL_PollEvent (introduite dans le tutorial Timer) qui permet de juste vérifier s'il y a des evenements en attente et elle rends la main tout de suite.
Dernière édition par moi1392 le 23 Avr 2005 23:34, édité 1 fois.
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 24 Avr 2005 01:47

En fait, je crois que j'ai du mal à comprendre la signification de cette ligne:
Code: Tout sélectionner
while ( SDL_WaitEvent(&event))
{
}

Traduite en français ça devrait donner:
Tant que ************ répeter infiniment les instructions dans la boucle while

Et peux tu me completer cette phrase en remplaçant ************ par des mots?
Car j'ai l'impression que je n'ai pas bien compris la signification...

Au fait, sachant que mon programme fait plus de 1500 lignes, je peux pas tout te montrer...Par contre voici un plus gros extrait si tu veux:
Code: Tout sélectionner
/***INCLUDE***/
#include <stdio.h> //Pour printf(), scanf(), getchar()
#include <string.h> //Pour strcpy(), strcmp(), strlen()
#include <stdlib.h> // Pour exit()
#include <SDL/SDL.h> // pour l'utilisation générale de SDL

/***VARIABLES***/
char titre[40+1] = "Le titre de ma fenêtre\0";
char icone[7+5+4+1] = "images/icone.bmp\0";

/***INITSDL***/
int initSDL(){
   /*Initialisation de SDL*/
        if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)<0){
                fprintf(stderr, "Impossible d'initialiser SDL: %s\n", SDL_GetError());
                exit(0);
        }//Fin de la boucle if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)<0)
        atexit(SDL_Quit); //Pour quitter proprement SDL
   return(0);
}//Fin de la boucle int initSDL()

/***FENETRE***/
int fenetre(){
   SDL_WM_SetCaption("Les 4 éléments", NULL);
        if(fopen(icone, "r")==NULL){
                fprintf(stderr, "Impossible de charger l'icône du programme.\n");
                exit(0);
   }
        SDL_WM_SetIcon(SDL_LoadBMP(icone),NULL);
   return(0);
}

/***MAIN***/
int main(void){
//Là j'ai raccourci ^^

   /*Initialisation de SDL*/
   initSDL();

   /*Chargement des surfaces*/
   SDL_Surface *sfc_fenetre;

   /*Chargement de la variable event*/
   SDL_Event event;
   
   /*Titre, icône de la fenêtre*/
   fenetre();
   
        /*Chargement de la fenêtre*/
   sfc_fenetre=SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
        if(sfc_fenetre==NULL){
                  fprintf(stderr, "Impossible de passer en 640x480 en 16 bpp: %s\n", SDL_GetError());
                  exit(0);
        }//Fin de la boucle if(sfc_fenetre==NULL)
   
   /*Mettre à jour l'affichage*/
   SDL_UpdateRect(sfc_fenetre, 0, 0, 0, 0);
   
   /*Attendre l'appui d'une touche pour continuer*/
   while(SDL_WaitEvent(&event) && event.type != SDL_KEYDOWN){
      switch (event.type){
              case SDL_QUIT:   //Lorsque l'on ferme la fenêtre
               printf("1");
         break;

         case SDL_KEYDOWN:
                         printf("touche pressee : %d\n", event.key.keysym.sym);
                         break;
                }
   }
}//Fin de la main()


voilà j'éspère que ça peut t'aider pour la compréhension de mon problème.
j'ai testé ce code, il se compile bien ;-)

PS: OUPS! J'AI ECRIS UN NOUVEAU TOPIC AU LIEU DE REPONDRE. PENSE A SUPPRIMER MON TOPIC DONT LE NOM EST: "Voilà exactement..." DESOLE
[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 24 Avr 2005 12:43

bon ben trop tard.. j'ai répondu dans l'autre topic :D ....
Par contre, si tu refais ça, sache que tu peux supprimer toi même tes topics si tu le désires :oui: en haut à droite tu as "suppr" sur les topic que tu as écrit. si c'est le premier d'un nouveau post, tu dois pouvoir supprimer tout le post. :)

Rendez vous dans l'autre topic pour la suite donc :D
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 27 Avr 2005 19:16

Merci moi1392, j'ai appris pleins de trucs en lisant ce que tu as dis sur l'autre topic.
Je vais mettre en oeuvre tout ça ;-)
[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

OK donc la variable c mieux...

Messagede YuGiOhJCJ le 27 Avr 2005 20:27

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

...
[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

les boucles...NON!

Messagede YuGiOhJCJ le 27 Avr 2005 20:28

mais j'arrête d'appeler boucle ce qui ne l'ai pas!
Tu as raison...
[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 27 Avr 2005 21:45

c'est comme tu le sens :) au moins, ça t'apprends plein de choses et tu progresses vite ;)
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 SephyYazoo le 28 Avr 2005 00:29

pffffffffft la prochaine fois vous intitulerez ce genre de topic "Langue extra-terrestre! danger pour les êtres humains" xD
SephyYazoo
 

Suivante

Retourner vers Besoin d'aide en SDL ?

Qui est en ligne

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

cron