Bonjour ,

je code un petit jeu en SDL et il se trouve que mon programme ne fonctionne pas bien...le menu principal marche très bien mais dès que j'appuie sur KP1 ca bug !

L'appuie de KP1 doit envoyer sur un menu de choix de personnage et ca ne marche pas.

Pourtant j'ai tester mon menu d'accueil seul en désactivant KP1 et il marche tout à fait bien. Le probleme vient donc lors de l'appel de la fonction...

je vous remercie pour votre aide.

Voici le main.c
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
 
/*
main.c
------
 
Par Kanak, pour les kevins
Rôle : menu du jeu. Permet de choisir les personnages
 
*/
 
 
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <FMOD/fmod.h>
 
#define TEMPS 10
 
#include "choixperso1.h"
 
int main(int argc, char *argv[])
{
    /* ----------------------------*/
    /*   Déclaration de variables  */
    /*-----------------------------*/
 
SDL_Surface *ecran = NULL,*menu = NULL,*viseur =NULL;		 // création des surfaces écran et menu
SDL_Surface *perso1 = NULL,*perso2 = NULL,*perso3 = NULL;
SDL_Rect positionViseur,positionMenu,positionPerso1,positionPerso2,positionPerso3;					 // définition des positions du viseur et du menu
 
SDL_Event event;
FSOUND_STREAM *MusiqueMenu = NULL;  						  //  pointeur sur la musique
 
int continuer =1;																		// variable qui détermine la boucle du jeu
int tempsPrecedent = 0;
int tempsActuel =0;
 
 
    /* ----------------------------*/
    /*   Paramétrage des variables */
   /*			de  FMOD           */
   /*-----------------------------*/
 
 FSOUND_Init(44100, 32, 0);																	// initialisation de FMOD		
 
	MusiqueMenu = FSOUND_Stream_Open("Musique/Menu.mp3", FSOUND_LOOP_NORMAL, 0, 0);				// ouverture de la musique
    if ( MusiqueMenu == NULL )															// Vérification du chargement
    {
        fprintf(stderr, "Impossible de lire le son du menu. \n");
        exit(EXIT_FAILURE);
    }
 
	FSOUND_Stream_SetLoopCount(MusiqueMenu, -1);												// On active la répétition de la musique à l'infini 
    FSOUND_Stream_Play(FSOUND_FREE, MusiqueMenu);												// On joue la musique
 
	/* ----------------------------*/
	/*   Paramétrage des variables */
	/*			de la SDL          */
	/*-----------------------------*/
 
    SDL_Init(SDL_INIT_VIDEO);																// Initialisation de la SDL 
 
    SDL_ShowCursor(SDL_DISABLE);															// désactivation du curseur souris
 
	SDL_WM_SetIcon(IMG_Load("Images/viseur.png"), NULL);										// charge l'icone d'en tête du jeu
    ecran = SDL_SetVideoMode(1280,1000, 32, SDL_HWSURFACE | SDL_DOUBLEBUF  );				// paramétrage de la fenetre du programme
	SDL_WM_SetCaption("Shoot game : WIK ", NULL);									        // En-tête du programme
 
 
	menu = IMG_Load("Images/menu.png");												
	SDL_SetColorKey(menu, SDL_SRCCOLORKEY, SDL_MapRGB(menu->format, 255, 255, 255));		// Suppression (partielle) du blanc autour de l'image pour ne pas avoir un carré
	viseur = IMG_Load( "Images/viseur.png");			// Chargement de l'image du viseur
 
	perso1 = IMG_Load("Images/peyo.png");												
	SDL_SetColorKey(perso1, SDL_SRCCOLORKEY, SDL_MapRGB(perso1->format, 255, 255, 255));		// Suppression (partielle) du blanc autour de l'image pour ne pas avoir un carré
	perso2 = IMG_Load("Images/gwen.png");												
	SDL_SetColorKey(perso2, SDL_SRCCOLORKEY, SDL_MapRGB(perso2->format, 255, 255, 255));		// Suppression (partielle) du blanc autour de l'image pour ne pas avoir un carré
	perso3 = IMG_Load("Images/cliocrash.png");												
	SDL_SetColorKey(perso3, SDL_SRCCOLORKEY, SDL_MapRGB(perso3->format, 255, 255, 255));		// Suppression (partielle) du blanc autour de l'image pour ne pas avoir un carré
 
 
	if (  menu == NULL || viseur == NULL || perso1 == NULL || perso2 == NULL || perso3 == NULL)											// Vérification du chargement
    {
        fprintf(stderr, "Impossible de cahrger les images. \n");
        exit(EXIT_FAILURE);
    }
 
	positionMenu.x=0;
	positionMenu.y=0;
 
	positionPerso1.x = ecran->w +1;
	positionPerso1.y = 0;
	positionPerso2.x = ecran->w +101;
	positionPerso2.y = ecran->h +110;
	positionPerso3.x = 0;
	positionPerso3.y = ecran->h + 5 ;
 
	/* ------------------------------*/
	/*   Boucle while du programme   */
	/* continuer = condition d'arret */
	/*--------------------------------*/
 
 
    while (continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:																		// Veut arrêter le jeu
                        continuer = 0;
                        break;	
					case SDLK_KP1 :
						FSOUND_Stream_Stop(MusiqueMenu);
						choixperso1(ecran);
						break;
                }
 
			case SDL_MOUSEMOTION:																	// le viseur suit la souris
						positionViseur.x = event.motion.x - (viseur->w / 2);								// le viseur est centré sur le curseur de la souris
						positionViseur.y = event.motion.y - (viseur->h / 2);
						break;
 
        }
	tempsActuel = SDL_GetTicks();
 
	if (tempsActuel - tempsPrecedent > TEMPS )																							// Si cela fait TEMPS ms  ( économie de CPU )
	{		
 
				positionPerso1.x--;
				positionPerso1.y++;
				positionPerso2.x--;
				positionPerso2.y--;
				positionPerso3.x++;
				positionPerso3.y--;
				tempsPrecedent = tempsActuel;
 
	}
		else																							
	{
		SDL_Delay(TEMPS - (tempsPrecedent- tempsActuel));
	}
	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
	SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
	SDL_BlitSurface(perso1, NULL, ecran, &positionPerso1);
	SDL_BlitSurface(perso2, NULL, ecran, &positionPerso2);
	SDL_BlitSurface(perso3, NULL, ecran, &positionPerso3);
	SDL_BlitSurface(viseur, NULL, ecran, &positionViseur);											// Blit du viseur
        SDL_Flip(ecran);
    }
 
 
	/* ------------------------------*/
	/*			ARREET DE SDL		 */
	/*-------------------------------*/
 
SDL_FreeSurface(viseur);
SDL_FreeSurface(perso1);
SDL_FreeSurface(perso2);
SDL_FreeSurface(perso3);
SDL_FreeSurface(menu);
SDL_Quit();
 
	/* ------------------------------*/
	/*			ARREET DE FMOD		 */
	/*-------------------------------*/
 
 
	FSOUND_Stream_Close(MusiqueMenu);							// On libère la mémoire occupée par la musique
    FSOUND_Close();											// On ferme FMOD 
 
    return EXIT_SUCCESS;
}

Et voici le code de choixperso1.c qui contient la fonction choixperso1
Ne faite pas attention à l'appel de choixperso2 ( je l'ai mis en commentaire dans le code car pour le moment je souhaite juste régler l'histoire du choix du 1er perso.

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
 
/*
ChoixPersonnage1.c
-----
 
Par Kanak, pour les kevins
Rôle : permet de choisir les personnages gentil
 
*/
 
 
 
 
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <FMOD/fmod.h>
#include <SDL/SDL_rotozoom.h>
 
#include "choixperso1.h"
 
 
void choixperso1(SDL_Surface * ecran)
{
    /* ----------------------------*/
	/*   Déclaration de variables  */
	/*-----------------------------*/
 
	SDL_Surface *viseur=NULL ,*zoom1 =NULL,*zoom2=NULL,*zoom3=NULL, *fond= NULL;		// création des surfaces écran et menu et zoom
	SDL_Surface *perso12 =NULL,*perso22 =NULL,*perso32= NULL;
	SDL_Surface *perso11 =NULL,*perso21 =NULL,*perso31= NULL;
	SDL_Surface *perso13 =NULL,*perso23 =NULL,*perso33= NULL;
	SDL_Rect positionViseur,positionFond,positionPerso1,positionPerso2,positionPerso3;		// définition des positions du viseur et du menu
    SDL_Event event;
 
    FSOUND_STREAM *MusiquePersos = NULL;  
 
	int continuer = 1;																		// variable qui détermine la boucle du jeu
	double angle=0,zoom=1.0;
	int choix;
 
    /* ----------------------------*/
	/*   Paramétrage des variables */
	/*			de  FMOD           */
	/*-----------------------------*/
 
	MusiquePersos = FSOUND_Stream_Open("Musique/MusiquePersos.mp3", FSOUND_LOOP_NORMAL, 0, 0);				// ouverture de la musique
 
	FSOUND_Stream_SetLoopCount(MusiquePersos, -1);												// On active la répétition de la musique à l'infini 
	FSOUND_Stream_Play(FSOUND_FREE, MusiquePersos);												// On joue la musique
 
	/* ----------------------------*/
	/*   Paramétrage des variables */
	/*			de la SDL          */
	/*-----------------------------*/
 
 
	perso11 = IMG_Load("Images/gwen.png");													// chargement de l'image du personnage 1 
	SDL_SetColorKey(perso11, SDL_SRCCOLORKEY, SDL_MapRGB(perso11->format, 255, 255, 255));	// Suppression (partielle) du blanc autour de l'image pour ne pas avoir un carré
	perso12 = IMG_Load("Images/gwenmod.png");													
	SDL_SetColorKey(perso12, SDL_SRCCOLORKEY, SDL_MapRGB(perso12->format, 255, 255, 255));	
	perso13 = IMG_Load("Images/gwencrash.png");													
	SDL_SetColorKey(perso13, SDL_SRCCOLORKEY, SDL_MapRGB(perso13->format, 255, 255, 255));	
 
	perso21 = IMG_Load("Images/clio.png");													// chargement de l'image du personnage 1 
	SDL_SetColorKey(perso21, SDL_SRCCOLORKEY, SDL_MapRGB(perso21->format, 255, 255, 255));	// Suppression (partielle) du blanc autour de l'image pour ne pas avoir un carré
	perso22 = IMG_Load("Images/cliomod.png");													
	SDL_SetColorKey(perso22, SDL_SRCCOLORKEY, SDL_MapRGB(perso22->format, 255, 255, 255));	
	perso23 = IMG_Load("Images/cliocrash.png");													
	SDL_SetColorKey(perso23, SDL_SRCCOLORKEY, SDL_MapRGB(perso23->format, 255, 255, 255));	
 
	perso31 = IMG_Load("Images/peyo.png");													// chargement de l'image du personnage 1
	SDL_SetColorKey(perso31, SDL_SRCCOLORKEY, SDL_MapRGB(perso31->format, 255, 255, 255));	// Suppression (partielle) du blanc autour de l'image pour ne pas avoir un carré		perso32 = IMG_Load("Images/peyomod.png");	
	perso32 = IMG_Load("Images/peyomod.png");													
	SDL_SetColorKey(perso22, SDL_SRCCOLORKEY, SDL_MapRGB(perso22->format, 255, 255, 255));	
	SDL_SetColorKey(perso32, SDL_SRCCOLORKEY, SDL_MapRGB(perso32->format, 255, 255, 255));	
	perso33 = IMG_Load("Images/peyocrash.png");													
	SDL_SetColorKey(perso33, SDL_SRCCOLORKEY, SDL_MapRGB(perso33->format, 255, 255, 255));	
 
	viseur = IMG_Load( "Images/viseur.png");   // Chargement de l'image du viseur
 
	fond = IMG_Load("Images/perso1.png");												
 
	if (fond== NULL || viseur == NULL || perso11 == NULL || perso12 == NULL || perso13 == NULL || perso21 == NULL || perso22 == NULL || perso23 == NULL || perso31 == NULL || perso32 == NULL || perso33 == NULL )											// Vérification du chargement
    {
        fprintf(stderr, "Impossible de charger les images. \n");
        exit(EXIT_FAILURE);
    }
 
	positionFond.x=0;
	positionFond.y=0;
 
	positionPerso1.x = 200;
	positionPerso1.y = 800;
	positionPerso2.x = 600;
	positionPerso2.y = 800;
	positionPerso3.x = 1000;
	positionPerso3.y = 800;
 
	/* ------------------------------*/
	/*   Boucle while du programme   */
	/* continuer = condition d'arret */
	/*--------------------------------*/
 
 
    while (continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_KP1:	
						while(positionPerso1.x != ecran->w/2 - perso11->w &&  positionPerso1.y != ecran->h/2 - perso11->h )          // tant qu'on est pas au centre de l'ecran
						{
							zoom1= rotozoomSurface(perso11, angle,zoom ,1); //On grandit l'image
							positionPerso1.x++;   // en la rapprochant du centre
							positionPerso1.y--;
							SDL_BlitSurface(zoom1 , NULL, ecran, &positionPerso1); //On affiche le zoom de la surface image.
							SDL_FreeSurface(zoom1); //On efface la surface zoom car on va la redéfinir dans la prochaine boucle. Si on ne le fait pas, cela crée une fuite de mémoire. 
							zoom += 2 ;
						};
 
						choix=1;
						SDL_Delay(2000);
						//ChoixPersonnages2(ecran,choix,perso11,perso12,perso13);
                        break;	
 
                    case SDLK_KP2:																		
						while(positionPerso2.x != ecran->w/2 - perso21->w &&  positionPerso2.y != ecran->h/2 - perso21->h )          // tant qu'on est pas au centre de l'ecran
						{
							zoom2= rotozoomSurface(perso21, angle,zoom , 1); //On grandit l'image
							positionPerso2.x++;   // en la rapprochant du centre
							positionPerso2.y--;
							SDL_BlitSurface(zoom2 , NULL, ecran, &positionPerso2); //On affiche le zoom de la surface image.
							SDL_FreeSurface(zoom2); //On efface la surface zoom car on va la redéfinir dans la prochaine boucle. Si on ne le fait pas, cela crée une fuite de mémoire. 
							zoom += 2 ;
						};
 
						choix=2;
						SDL_Delay(2000);
						//ChoixPersonnages2(ecran,choix,perso21,perso22,perso23);
                        break;	
 
                    case SDLK_KP3:																		
						while(positionPerso3.x != ecran->w/2 - perso31->w &&  positionPerso3.y != ecran->h/2 - perso31->h )          // tant qu'on est pas au centre de l'ecran
						{
							zoom2= rotozoomSurface(perso31, angle,zoom , 1); //On grandit l'image
							positionPerso3.x++;   // en la rapprochant du centre
							positionPerso3.y--;
							SDL_BlitSurface(zoom3 , NULL, ecran, &positionPerso3); //On affiche le zoom de la surface image.
							SDL_FreeSurface(zoom3); //On efface la surface zoom car on va la redéfinir dans la prochaine boucle. Si on ne le fait pas, cela crée une fuite de mémoire. 
							zoom += 2 ;
						};
 
						choix=3;
						SDL_Delay(2000);
						//ChoixPersonnages2(ecran,choix,perso31,perso32,perso33);
                        break;			
 
                }
			case SDL_MOUSEMOTION:																	// le viseur suit la souris
					positionViseur.x = event.motion.x - (viseur->w / 2);								// le viseur est centré sur le curseur de la souris
					positionViseur.y = event.motion.y - (viseur->h / 2);
					break;
 
        }
 
 
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
	    SDL_BlitSurface(fond, NULL, ecran, &positionFond);
	    SDL_BlitSurface(perso11, NULL, ecran, &positionPerso1);
		SDL_BlitSurface(perso21, NULL, ecran, &positionPerso2);
	    SDL_BlitSurface(perso31, NULL, ecran, &positionPerso3);
		SDL_BlitSurface(viseur, NULL, ecran, &positionViseur);
 
        SDL_Flip(ecran);
    }
 
	SDL_FreeSurface(viseur);
    SDL_FreeSurface(fond);
 
}


Merci