SDL : Gestion des mouvements dans une fonction

The_Sin Messages postés 43 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 4 février 2006 - 3 déc. 2005 à 23:38
cs_beg0 Messages postés 51 Date d'inscription lundi 17 janvier 2005 Statut Membre Dernière intervention 13 mars 2011 - 4 mai 2009 à 16:01
Salut, j'ai un problème en SDL en C :

J'ai déplacé ma boucle de gestion de mouvements dans une fonction de
perso.c et là ça marche plus, le problème viendrait-il d'une erreur
dans le code ? pourtant j'ai beaucoup cherché...

Tout se link et se compile parfaitement mais plus rien ne se passe à l'appuie sur les touches.

Voici mon code ( s'il y a du code en commentaire c'est que je l'ai déplacé
pour faire des tests, je l'ai coloré volontairement en bleu foncé ) .



Main.c :

<sub>

</sub><sub>#include <stdlib.h>


#include <SDL/SDL.h>




#include "main.h"




SDL_Surface *sEcran, *sVaisseau ;

SDL_Event event ;</sub><sub>



</sub><sub>void M_Quit() { ... }

void M_Init() { ... }



int main(int argc, char argv[])

{

M_Init() ;

//Variables et initialisation

SDL_Rect Rect_Vaisseau ; //Données sur le Vaisseau

coord(&Rect_Vaisseau) ; //Position de départ du Vaisseau

struct clavier Mouv_Vaisseau ; //mouvements du Vaisseau

Mouv_Vaisseau.keyleft Mouv_Vaisseau.keyright 0 ; //Mise à zero des variables de mouvements



SDL_SetColorKey(sVaisseau, SDL_SRCCOLORKEY, SDL_MapRGB(sVaisseau->format, 255, 0, 255)) ; //couleur alpha Vaisseau



//boucle principale

while(1)

{

while(SDL_PollEvent(&event))

{

if(event.type == SDL_QUIT) M_Quit() ;







/* if((event.type SDL_KEYDOWN) || (event.type SDL_KEYUP))

{


if(event.key.keysym.sym == SDLK_LEFT)


Mouv_Vaisseau.keyleft (event.type SDL_KEYDOWN) ;


if(event.key.keysym.sym == SDLK_RIGHT)



Mouv_Vaisseau.keyright (event.type SDL_KEYDOWN) ;

} */





}



//gestion des mouvements

eventmouv(&Mouv_Vaisseau, &Rect_Vaisseau) ;



if(Mouv_Vaisseau.keyright)


{


Rect_Vaisseau.x += 10;


if(Rect_Vaisseau.x >= 700)


Rect_Vaisseau.x = 700 ;


}

if(Mouv_Vaisseau.keyleft)


{


Rect_Vaisseau.x -= 10;


if(Rect_Vaisseau.x <= 0)


Rect_Vaisseau.x = 0 ;


}



//affichage

SDL_FillRect(sEcran, NULL, SDL_MapRGB(sEcran->format, 0, 0, 255)) ;

SDL_BlitSurface(sVaisseau, NULL, sEcran, &Rect_Vaisseau) ;

SDL_Flip(sEcran) ;

}



M_Quit() ;

}





</sub>


Main.h :



<sub>#ifndef GAME_H


#define GAME_H




//gestion du personnage

#include "perso.h"




#endif






</sub>perso.h :



<sub>#ifndef PERSO_H


#define PERSO_H




struct clavier


{


int keyleft ;


int keyright ;


} ;




void coord(SDL_Rect *dest) ;


void eventmouv(struct clavier *mouv, SDL_Rect *dest) ;




#endif</sub>




perso.c :



<sub>#include <SDL/SDL.h>



#include "perso.h"



SDL_Event Event ;



void coord(SDL_Rect *dest)

{

dest->x = 300 ;

dest->y = 564 ;

}



void eventmouv(struct clavier *mouv, SDL_Rect *dest)

{

while(SDL_PollEvent(&Event))

{

if((Event.type SDL_KEYDOWN) || (Event.type SDL_KEYUP))

{

if(Event.key.keysym.sym == SDLK_LEFT)


mouv->keyleft (Event.type SDL_KEYDOWN) ;

if(Event.key.keysym.sym == SDLK_RIGHT)



mouv->keyright (Event.type SDL_KEYDOWN) ;

}



/* if(mouv->keyright)


{


dest->x += 10;


if(dest->x >= 700)


dest->x = 700 ;


}

if(mouv->keyleft)


{


dest->x -= 10;


if(dest->x <= 0)


dest->x = 0 ;


} */

}

}





Merci d'avance

</sub>

1 réponse

cs_beg0 Messages postés 51 Date d'inscription lundi 17 janvier 2005 Statut Membre Dernière intervention 13 mars 2011 1
4 mai 2009 à 16:01
La doc sur SDL_PoolEvent() dit ( http://sdl.beuc.net/sdl.wiki/SDL_PollEvent )



Polls for currently pending events.


If <tt class= "backtick">event</tt> is not <tt class="backtick">NULL</tt>, the next event is removed from the queue and stored in the SDL_Event structure pointed to by <tt class ="backtick">event</tt>.


Il te faut supprimer le while(SDL_PoolEvent(&Event)) dans eventmouv(), et dans ta boucle principale d'evenement (celle qu'il y a dans le main), passer la variable 'event' a la fonction eventmouv();
suis-je clair ?
0
Rejoignez-nous