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 :

SDL et gestion d'une manette


Sujet :

SDL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut SDL et gestion d'une manette
    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 :

    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)
    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
    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);
          }
    }
    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
     
    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);
                }
          }
    }
    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

    Merci d'avoir pris le temps de lire mon message et du temps que vous prendrez à y répondre.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Vous semblez être dans un thread, peut être il y a un soucis et qu'il faut appeler ce genre de choses dans le thread principal. Avez vous bien activer la gestion des joysticks dans le main. Il faut aussi que le joysticks soit branché au démarrage du programme, je crois.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2015
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    "Vous semblez être dans un thread"

    J'ai du mal à comprendre. Je ne fait pas de multi-thread dans mon programme, comment pourrait-il se tromper/changer de thread ?

    Pour le reste, ma manette est branchée au démarrage du programme et est bien détectée par SDL_NumJoysticks.

    J'initialise d’ailleurs la SDL avec SDL_INIT_EVERYTHING donc normalement la gestion du Joystick est faite. J'ai tenter de rajouter SDL_InitSubSystem(SDL_JOYSTICK) mais le problème persiste :-/.

    Edit:

    Je viens de faire un test on ne peut plus simple histoire de voir si ça pouvais venir de l'emplacement de mes appels/initialisation des fonctions dans mon code :

    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
    30
    31
    32
    33
     
    #include <SDL.h>
    #include <stdio.h>
     
    int	main(int argc, char **argv)
    {
    	SDL_Window		*win;
    	SDL_Surface		*screen;
    	SDL_Event evn;
    	SDL_Joystick *joy;
     
     
    	win = SDL_CreateWindow("lklk", SDL_WINDOWPOS_CENTERED,\
    			SDL_WINDOWPOS_CENTERED, 500, 500, SDL_WINDOW_SHOWN);
    	if (win)
    	{
    		screen = SDL_GetWindowSurface(win);
    		SDL_SetSurfaceRLE(screen, 1);
    		SDL_FillRect(screen, NULL, 0xff00ff);
    		SDL_UpdateWindowSurface(win);
    		joy = SDL_JoystickOpen(0);
    		SDL_JoystickEventState(SDL_QUERY);
    		while (1)
    		{
    			if (SDL_WaitEvent(&evn))
    				printf("type : %d\n", evn.type);
    		}
                    SDL_JoystickClose(joy);
    		SDL_DestroyWindow(win);
    		SDL_Quit();
    	}
    	return (0);
    }
    Et j'ai exactement le même problème.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Pouvez-vous chercher/déterminer le type que vous retourne la SDL ?
    De plus, la méthode que vous faites avec SDL_WaitEvent() est assez "niaise", je trouve. En général on préférera un SDL_PollEvent().

    Une telle ligne SDL_JoystickEventState(SDL_QUERY); ne sert à rien en l'état.

    Il manque le SDL_JoystickEventState(SDL_ENABLE);. Ici : http://alexandre-laurent.developpez....sdl/joysticks/ il y a des explications sur la gestion des joysticks et même des codes d'exemple (certes SDL 1.2, mais bon ça se convertit facilement).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. [Mono|Linux] gestion d'une manette de jeu
    Par Rachel dans le forum Contribuez
    Réponses: 1
    Dernier message: 31/03/2012, 22h19
  2. [Composite] Gestion d'une recherche avancée
    Par Loctar dans le forum Design Patterns
    Réponses: 12
    Dernier message: 23/06/2005, 18h32
  3. [Clavier] Gestion d'une invite de commandes
    Par Damian dans le forum Assembleur
    Réponses: 9
    Dernier message: 28/04/2005, 16h41
  4. gestion des boutons d'une manette : relachement
    Par backfire dans le forum DirectX
    Réponses: 1
    Dernier message: 05/01/2005, 10h13
  5. gestion d'une erreur
    Par Jeannotc dans le forum Bases de données
    Réponses: 8
    Dernier message: 25/06/2004, 18h04

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