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

Développement 2D, 3D et Jeux Discussion :

C++ et SDL, identifier les boutons de ma manette.


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut C++ et SDL, identifier les boutons de ma manette.
    Hello World !

    J'ai fait un petit code en C++ (enfin on peut dire C puisque j'ai utilisé cstdio et que j'ai eu recours à printf, fprintf et fopen et fclose...) faisant appel à la SDL pour gérer une manette PS3 sous Linux. (mais qu'importe l'OS.)

    Voici le 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
     
    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <SDL/SDL.h>
     
    #define exit var = false;
    #define stop
     
    using namespace std;
     
    int joystick_info(SDL_Joystick *ptr);
    int controller_test(SDL_Joystick *ptr);
     
    int main(){
     
    	SDL_Joystick *joystick = NULL; //Creation of joystick pointer
     
    	SDL_Init( SDL_INIT_JOYSTICK ); //Initialisation of Joystick control by SDL.
    	SDL_JoystickEventState(SDL_ENABLE);
    	SDL_Event event;
    	SDL_WaitEvent(&event);
     
    	joystick = SDL_JoystickOpen(0);
     
    	joystick_info(joystick);
    	controller_test(joystick);
     
    	SDL_JoystickClose(joystick);
    	SDL_Quit();
     
    	return EXIT_SUCCESS;
     
    }
     
    int joystick_info(SDL_Joystick *ptr)
    {
    	int i;
    	FILE *file = fopen("manette.txt", "w+");
     
    	if (file != NULL){
     
            	fprintf(file, "\tNombre de mannette(s) : %d\n", SDL_NumJoysticks());
    		printf("\tNombre de joysticks : %d\n", SDL_NumJoysticks());
     
    		for(i=0; i < SDL_NumJoysticks();i++){
     
    			fprintf(file,"\tManette n°%d = %s\n", SDL_NumJoysticks(), SDL_JoystickName(i));
    			printf("\tManette n°%d = %s\n", SDL_NumJoysticks(), SDL_JoystickName(i));
            		fprintf(file,"\tNombre de boutons : %d\n",SDL_JoystickNumButtons(ptr));
            		printf("\tNombre de boutons : %d\n",SDL_JoystickNumButtons(ptr));
            		fprintf(file,"\tNombre d'axes : %d\n",SDL_JoystickNumAxes(ptr));
            		printf("\tNombre d'axes : %d\n",SDL_JoystickNumAxes(ptr));
            		fprintf(file,"\tNombre de chapeaux : %d\n",SDL_JoystickNumHats(ptr));
            		printf("\tNombre de chapeaux : %d\n",SDL_JoystickNumHats(ptr));
            		fprintf(file,"\tNombre de trackballs : %d\n",SDL_JoystickNumBalls(ptr));
    			printf("\tNombre de trackballs : %d\n",SDL_JoystickNumBalls(ptr));
     
    		}
     
    	fclose(file);
    	}
    	else {
    	return EXIT_FAILURE;
    	}
     
    	return EXIT_SUCCESS;
    }
     
    int controller_test(SDL_Joystick *ptr)
    {
    	bool var = true;
     
    	SDL_Event event;
     
    	while(var){
    		SDL_WaitEvent(&event);
    		switch(event.type){
    		case SDL_QUIT :
    		exit
    		break;
    		case SDL_JOYBUTTONDOWN :
    			switch(event.jbutton.button){
    			case 0:    //bouton select
    			printf("Select\n");
    			stop
    			break;
    			case 1:
    			printf("L3\n");
    			stop
    			break;
    			case 2:
    			printf("R3\n");
    			stop
    			break;
    			case 3:
    			printf("Start\n");
    			stop
    			break;
    			case 4:
    			printf("Croix directionnelle - Haut\n");
    			stop
    			break;
    			case 5:
    			printf("Croix directionnelle - Droite\n");
    			stop
    			break;
    			case 6:
    			printf("Croix directionnelle - Bas\n");
    			stop
    			break;
    			case 7:
    			printf("Croix directionnelle - Gauche\n");
    			stop
    			break;
    			case 8:
    			printf("L2\n");
    			stop
    			break;
    			case 9:
    			printf("R2\n");
    			stop
    			break;
    			case 10:
    			printf("L1\n");
    			stop
    			break;
    			case 11:
    			printf("R1\n");
    			stop
    			break;
    			case 12:
    			printf("Triangle\n");
    			stop
    			break;
    			case 13:
    			printf("Rond\n");
    			stop
    			break;
    			case 14:
    			printf("Croix\n");
    			stop
    			break;
    			case 15:
    			printf("Carré\n");
    			stop
    			break;
    			case 16:
    			printf("Bouton PlayStation\n");
    			exit
    			break;
    			}
    		break;
    		case SDL_JOYAXISMOTION :
    			switch(event.jaxis.axis){
    				case 0:		// axis 0 (left-right)
    				if(event.jaxis.value < -3200)
    				{
    					// left movement
    					printf("JoystickG - Gauche\n");
    					stop
    				}
    				else if(event.jaxis.value > 3200)
    				{
    					// right movement
    					printf("JoystickG - Droite\n");
    					stop
    				}
    				break;
    				case 1:		// axis 1 (up-down)
    				if(event.jaxis.value < -3200)
    				{
    					// up movement
    					printf("JoystickG - Haut\n");
    					stop
    				}
    				else if(event.jaxis.value > 3200)
    				{
    					// down movement
    					printf("JoystickG - Bas\n");
    					stop
    				}
    				break;
    				case 2:
    				if(event.jaxis.value < -3200)
    				{
    					// left movement
    					printf("JoystickD - Gauche\n");
    					stop
    				}
    				else if(event.jaxis.value > 3200)
    				{
    					// right movement
    					printf("JoystickD - Droite\n");
    					stop
    				}
    			break;
    			case 3:
    			if(event.jaxis.value < -3200)
    			{
    				// left movement
    				printf("JoystickD - Haut\n");
    				stop
    			}
    			else if(event.jaxis.value > 3200)
    			{
    				// right movement
    				printf("JoystickD - Bas\n");
    				stop
    			}
    			break;
    		break;
    		}
    	}
    }
    	return 0;
    }
    Qu'est-ce que cela doit faire ? C'est simple, d'une part j'affiche quelques infos sur la manette comme le nombre de boutons (informations que je stocke aussi dans un fichier texte) puis je fais interagir l'utilisateur qui doit appuyer sur les différents boutons et faire bouger les joysticks pour afficher différents printf qui renseignent l'utilisateur sur le bouton utiliser.

    C'est cette dernière partie qui me pose problème car lorsque j'exécute le programme j'obtiens ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	Nombre de joysticks : 1
    	Manette n°1 = Sony PLAYSTATION(R)3 Controller
    	Nombre de boutons : 19
    	Nombre d'axes : 4
    	Nombre de chapeaux : 0
    	Nombre de trackballs : 0
    Et quand j'appuis sur un bouton, je n'ai rien qui s'affiche. :/

    Je pense avoir fait une "petite" erreur mais je n'arrive pas à la localiser... Merci de bien vouloir éclairer ma lanterne.

    Cordialement.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    ben asez logiquement, si tu n'as rien qui s'affiche c'est que
    - l'event n'est pas le bon
    - aucun de tes case n'est bon

    Mets un breakpoint dans ton switch et tu sauras assez vite ce que tu obtiens.

    Btw le numéro de ta manette c'est i et pas SDL_NumJoysticks()
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci pour cette réponse

    Je sais que le numéro de la manette est i seulement je trouve que l'affichage est pas top vu qu'en utilisant i j'obtiens "manette n° 0" j'ai donc "volontairement" introduit cette erreur.

    Sinon pour le switch qu'est-ce que tu veux dire par "mettre un breakpoint" ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Hikaru_lix Voir le message
    vu qu'en utilisant i j'obtiens "manette n° 0" j'ai donc "volontairement" introduit cette erreur.
    i+1

    Citation Envoyé par Hikaru_lix Voir le message
    Sinon pour le switch qu'est-ce que tu veux dire par "mettre un breakpoint" ?
    Utiliser ton IDE et en particulier son debugger pour.. debugger.
    Tu peux aussi commencer par virer tous tes if et juste print les valeurs qui passent. C'est ce que je fais en général au début, comme ça dès que je veux connaître un bouton je le presse et vois dans la sortie lequel c'est.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    ah bah je n'utilise pas d'IDE. Uniquement Vim et G++ ^^'...

    Oui je vais simplement incrémenter i alors

  6. #6
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 612
    Points
    2 612
    Par défaut
    Bonjour, pour debugger G++, il y a GDB.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci bien, je vais lire ça de suite.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    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 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Ma fiereté m'oblige de mettre le lien vers mon tutoriel : http://alexandre-laurent.developpez....e-application/ .

    De plus, pour les manettes, je conseille la lecture de : http://alexandre-laurent.developpez....sdl/joysticks/

    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.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos précieuses réponses ! Cependant je ne comprends vraiment le problème que j'ai avec l'event.

    Par exemple:
    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
    int main(){
        bool foo = true;
        SDL_Joystick *joystick = NULL; //Creation of joystick pointer.
        SDL_Init(SDL_INIT_JOYSTICK); //Initialisation of Joystick control.
        SDL_JoystickEventState(SDL_ENABLE); //Activation of event for the joystick.
     
        joystick = SDL_JoystickOpen(0);
     
        SDL_Event event;
     
            while(foo == true){
     
         /* 
             SDL_WaitEvent(&event);
             switch ( event.type ){
                 case SDL_JOYBUTTONDOWN :
                 printf("Button : %d\n",event.jbutton.button);
                 break;
             } */
     
             SDL_WaitEvent(&event);
             if ( event.type == SDL_JOYBUTTONDOWN )
             {
                 printf("Button : %d\n",event.jbutton.button);
                 var = false;
             }
         }
     
        SDL_JoystickClose(joystick);
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    Pas moyen d'avoir ne serait-ce qu'une touche (le terminal m'affiche rien...) Le plus étrange est que le switch (long comme un bras) de mon premier message marchait il y a... quelques mois. (c'est pas du code "neuf", je l'ai repris d'un ancien projet et.. ce qui marchait avant ne marche plus aujourd'hui )

    Ne serait-ce que dans ce bout de code ci-dessus, je comprends pas l'erreur. :/

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2015
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    OK !

    J'ai résolu le problème ! En fait ce n'était pas une question de code (enfin si mais bon) je m'étais trompé de version pour la SDL ^^ je bosse avec la SDL 2 du coup je devais utiliser g++ file.cc -lSDL2 et non -lSDL

    D'ailleurs dans le préprocesseur j'ai mis #include <SDL2/SDL.h>

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

Discussions similaires

  1. Les boutons d'un joystick avec la SDL
    Par Daedalus11 dans le forum SDL
    Réponses: 4
    Dernier message: 09/12/2011, 01h02
  2. Réponses: 20
    Dernier message: 19/12/2004, 18h52
  3. [Débutant][FLASH MX 2004]les boutons ?
    Par Battosaiii dans le forum Flash
    Réponses: 3
    Dernier message: 04/05/2004, 16h43
  4. Gérer les clics sur les boutons
    Par cyberlewis dans le forum Windows
    Réponses: 4
    Dernier message: 08/02/2004, 15h34

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