Bonjour à tous et toutes !
Alors voilà, j'ai lu les différents tutoriels sur la gestion des Controllers et des Joysticks avec la SDL2 mais mon problème persiste.
En bref :
J'ai créé une fonction afin de gérer les différents évènements de la SDL. Elle prend en paramètre un void *data dans lequel je met l'adresse de la structure principale de mon jeu qui contient toutes les données auxquelles j'ai besoin d'accéder et un tableau de pointeur sur fonction. Chaque case du tableau contenant un pointeur qui gère un certain type d'évènements (clavier/souris/manette/window/joystick/système). Mes premières fonctions (clavier/souris) marchent correctement. Elles appellent le bon type de fonction suivant l'évènement. En revanche, j'ai un problème avec ma manette. En effet, SDL_WaitEvent reçoit belle est bien un évènement, mais ce dernier ne semble pas correspondre avec l'une des défine de la SDL (SDL_CONTROLLERAXISMOTION)...
J'ai fait une impression du type que reçoit SDL_WaitEvent en castant le type dans un int. Je reçois 1530 lorsque, j'appuie sur un boutton de ma manette. En revanche rien lorsque je bouge les axis où le hat. Le truc étrange, c'est que normalement je récupère mes différents évènements via les defines de la SDL, mais pour ma manette ça ne semble pas fonctionner.
Voici les quelques defines que j'utilise pour récupérer les évènements :
Et je les appelle dans ma fonction comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 # define CHK_MMOTION(e) (e == SDL_MOUSEMOTION ? 1 : 0) # define CHK_MBUTON(e) (e == SDL_MOUSEBUTTONDOWN ? 1 : 0) # define CHK_MWHEL(e) (e == SDL_MOUSEWHEEL ? 1 : 0) # define CHK_MEVENT(e) (CHK_MWHEL(e) || CHK_MBUTON(e) || CHK_MMOTION(e) ? 1 : 0) # define CHK_CAXMOT(e) (e == SDL_CONTROLLERAXISMOTION || e == SDL_JOYAXISMOTION ? 1 : 0) # define CHK_CBTDOW(e) (e == SDL_CONTROLLERBUTTONDOWN || e == SDL_JOYBUTTONDOWN ? 1 : 0) # define CHK_CEVENT(e) (CHK_CAXMOT(e) || CHK_CBTDOW(e) ? 1 : 0)
EVNT_T est une define qui pointe dans ma structure le type de l'event. En outre, dans mon programme pour détecter un joystick, je procède comme suit :
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 static void check_eventype(t_envsdl *env, void *data, controlf_t *f) { if (EVNT_T(env) == SDL_QUIT) env->key->echap = 1; else if (EVNT_T(env) == SDL_KEYDOWN || EVNT_T(env) == SDL_KEYUP) f[0](env, data); else if (CHK_MEVENT(EVNT_T(env))) f[1](env, data); else if (CHK_CEVENT(EVNT_T(env))) f[2](env, data); printf("%d\n", (int)EVNT_T(env)); } void ft_keyhook_sdl(t_envsdl *env, void *data, controlf_t *f) { if (SDL_WaitEvent(&(EVNT(env))) != 0) { check_eventype(env, data, f); while (SDL_PollEvent(&(env->key->events)) != 0) check_eventype(env, data, f); } }
Le truc étrange, c'est que cette partie semble fonctionner correctement. Du coup, j'ai vraiment du mal à cerner d'où vient mon problème. Si vous avez des idées, je suis preneur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void init_joystick(t_game *e) { if (SDL_NumJoysticks() > 0) { e->joy = SDL_JoystickOpen(0); if (e->joy) { printf("%s detected.\n", SDL_JoystickName(e->joy)); SDL_JoystickEventState(SDL_ENABLE); } } }
Merci d'avoir pris le temps de lire mon message et du temps que vous prendrez à y répondre.
Partager