Project en sdl sous c windows

jilou2008 Messages postés 9 Date d'inscription samedi 7 février 2009 Statut Membre Dernière intervention 3 mars 2012 - 16 mars 2009 à 11:33
jilou2008 Messages postés 9 Date d'inscription samedi 7 février 2009 Statut Membre Dernière intervention 3 mars 2012 - 24 mars 2009 à 19:52
bonjour j ai un probleme j ai creer un project une sorte de jeux de ping pong mais mon probleme est que la balle ne rebondit pas ou va direct en fin d ecran et aussi ne suis pas les differente instruction il n y a pas de erreur lors du compilage mais l exe n est pas ce que je veux pouvez vous m aider merci d avance voici mon project:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <SDL.h>
#include <SDL_image.h>

int main(int argc, char *argv[])
{
SDL_Surface *ecran NULL, *balle NULL,*rectangle = NULL,*ligne = NULL;
SDL_Rect positionBalle,positionRectangle,positionLigne;
SDL_Event event;
int continuer 1,point 10;
int tempsPrecedent 0, tempsActuel 0;
int i = 0;
SDL_Init(SDL_INIT_VIDEO);

ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
SDL_WM_SetCaption("Gestion du temps en SDL", NULL);
rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 60, 32, 0, 0, 0, 0);
balle = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
ligne = SDL_CreateRGBSurface(SDL_HWSURFACE, 5, 480, 32, 0, 0, 0, 0);
positionBalle.x = 620;
positionBalle.y = 220;
positionRectangle.x = 50;
positionRectangle.y = 200;
positionLigne.x = 320;
positionLigne.y = 0;
SDL_EnableKeyRepeat(10, 10);


while (continuer)
{
SDL_PollEvent(&event); /* On utilise PollEvent et non WaitEvent pour ne pas bloquer le programme */
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN: /* Si appui d'une touche */

switch (event.key.keysym.sym)
{
case SDLK_p:
SDL_Delay(5000);
break;


case SDLK_UP:
positionRectangle.y--;
break;
case SDLK_DOWN:
positionRectangle.y++;
break;
}
}

if (!( positionBalle.x > 640 || point == 0 ))
{
tempsActuel = SDL_GetTicks();

if (tempsActuel - tempsPrecedent > 30 ) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle */
{
positionBalle.x--; /* On bouge balle */
if (positionBalle.x == 0)
{
positionBalle.x = 620;
point--;
}


else if ( positionBalle.x positionRectangle.x + 20 && positionBalle.y positionRectangle.y )
{
if (!(positionBalle.y = 0))
{
positionBalle.x++;
positionBalle.y--;
tempsPrecedent = tempsActuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
}
else
{
positionBalle.x++;
positionBalle.y--;
tempsPrecedent = tempsActuel;
}
}
else if ( positionBalle.x positionRectangle.x + 20 && positionBalle.y positionRectangle.y + 20)
{

positionBalle.x ++;
tempsPrecedent = tempsActuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */

}
else if ( positionBalle.x positionRectangle.x + 20 && positionBalle.y positionRectangle.y + 41)
{
if (!(positionBalle.y = 460))
{
positionBalle.x++;
positionBalle.y++;
tempsPrecedent = tempsActuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
}

else
{
positionBalle.x++;
positionBalle.y--;
tempsPrecedent = tempsActuel;

}
}
}
else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
{
SDL_Delay(30 - (tempsActuel - tempsPrecedent));
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 100, 0));
SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_FillRect(balle, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_FillRect (ligne,NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
SDL_BlitSurface(ligne, NULL, ecran, &positionLigne);
SDL_BlitSurface(balle, NULL, ecran, &positionBalle);
SDL_BlitSurface(rectangle, NULL, ecran, &positionRectangle);
SDL_Flip(ecran);
}
if (point == 0)
{
continuer = 0;
}
}

SDL_FreeSurface (rectangle);
SDL_FreeSurface(balle);
SDL_Quit();

return EXIT_SUCCESS;
}

4 réponses

kan64 Messages postés 3 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 17 mars 2009
16 mars 2009 à 22:56
//ouf ! pour commencer tu as un tas d'include qui ne servent à rien .
#include
#include <time.h>
//#include <sdl_image.h>// je vois pas pourquoi faire ? je vois pas de IMG_Load() dans le code
//ensuite tu charge trop le main ,tu devrais faire quelque chose comme ça .
/*********************************************/
#define LARG_ECRAN 640
#define HAUT_ECRAN 480
/****************************************/
/* prototype de la fonction principale */
void draw(SDL_Surface *Aecran,bool *Fin);
/* une fonction pour initialiser tes variables */
void Init_Pos(bool *INIT);
/***************************************/
/**une fonction pour controler que la vidéo accepte bien cette resolution ,ici 640x480 32*/
bool LOAD_Ecran(SDL_Surface *ecran )
{
if(SDL_SetVideoMode(LARG_ECRAN, HAUT_ECRAN, 32, SDL_HWSURFACE|SDL_DOUBLEBUF)!=0)
{
return true;
}else{// si 0 on returne false
return false;
}
}
/************************************************************/
SDL_Rect positionBalle,positionRectangle,positionLigne;
SDL_Surface *balle NULL,*rectangle NULL,*ligne = NULL;

int continuer 1,point 10;
int tempsPrecedent 0, tempsActuel 0;
int i = 0;
const unsigned int fps = 75;
int vitesse= 15;
bool LOADFin = false;
bool Load_ini = false;
bool Gu=false;
bool Dr=false;
bool Ht=false;
bool Bs=false;
SDL_Event event;
/************************************************************/
int main(int argc, char *argv[]){
SDL_Surface *ecran = NULL;
SDL_Init(SDL_INIT_VIDEO);

unsigned int Temps_de_pause = SDL_GetTicks();
int continuer = 1;
if(LOAD_Ecran(ecran)==true)
{
ecran =SDL_SetVideoMode(LARG_ECRAN, HAUT_ECRAN, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
}else SDL_Quit();

SDL_EnableKeyRepeat(10, 10);

while (continuer)// boucle principale
{
if(SDL_GetTicks() > (Temps_de_pause + 200 / fps) )//reglage du temps entre deux boucle
{

draw(ecran,&LOADFin);
SDL_Flip(ecran);

Temps_de_pause = SDL_GetTicks();
}
if(LOADFin){
continuer =0;
}
SDL_Delay (10);
}
//SDL_FreeSurface (?);
//SDL_FreeSurface (?);
SDL_Quit();
return EXIT_SUCCESS;
}
void Init_Pos(bool *INIT)
{
positionRectangle.x = 50;
positionRectangle.y = 200;
positionBalle.x = 620;
positionBalle.y = 220;
positionLigne.x = 320;
positionLigne.y = 0;
/*********************/
*INIT = true;
}
/***************** foncion principale **************************/
void draw(SDL_Surface *ecran2,bool *Fin)
{
positionRectangle.w = 20;
positionRectangle.h = 60;
rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, positionRectangle.w, positionRectangle.h, 32, 0, 0, 0,0);
balle = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
ligne = SDL_CreateRGBSurface(SDL_HWSURFACE, 5, 480, 32, 0, 0, 0, 0);
tempsActuel = SDL_GetTicks();
if(!Load_ini)
{
Init_Pos(&Load_ini);
}

if(Gu){
positionBalle.x-= fps/vitesse; /* On bouge balle vers la gauche */
}
if(Dr){
positionBalle.x+= fps/vitesse; /* On bouge balle vers la droite*/
}
if(Ht){
positionBalle.y-= fps/vitesse; /* On bouge balle en haut */
}
if(Bs){
positionBalle.y+= fps/vitesse; /* On bouge balle en bas ( hoo macarena !!)*/
}



if ( positionBalle.x < positionRectangle.x+20
&&positionBalle.y+20 > positionRectangle.y
&&positionBalle.y < positionRectangle.y+60 )
{
Gu=false;
Dr=true;
positionBalle.x+= fps/vitesse;
if ( positionBalle.y < positionRectangle.y+20)
{ Ht=true;}

}

if ( positionBalle.x+30 > LARG_ECRAN )
{
Gu=true;
Dr=false;
Ht=false;
// Bs=true;
// positionBalle.x-= fps/vitesse;
}
if ( positionBalle.y+30 > HAUT_ECRAN )
{
// Gu=true;
// Dr=false;
Ht=true;
Bs=false;
// positionBalle.x-= fps/vitesse;
}
if ( positionBalle.y < 0 )
{
// Gu=true;
// Dr=false;
Ht=false;
Bs=true;
// positionBalle.x-= fps/vitesse;
}
// je sais ça fait plus casse briques que ping pong
// écrire ton code ici ;tu peux aussi le modifier
// le diviser par évenements et
//créer une fonction comme draw() pour chaque une d'elles
//surtout pour detecter les colisions parce que là c'est 00.
// tu dois afficher dans ecrant2, plus dans ecran
SDL_FillRect(balle, NULL, SDL_MapRGB(ecran2->format, 255, 255, 255));
SDL_FillRect (ligne,NULL, SDL_MapRGB(ecran2->format, 255, 255, 255));
SDL_FillRect(rectangle, NULL, SDL_MapRGB(ecran2->format, 255, 255, 255));
SDL_FillRect(ecran2, NULL, SDL_MapRGB(ecran2->format, 0, 100, 0));
SDL_BlitSurface(ligne, NULL, ecran2, &positionLigne);
SDL_FreeSurface (ligne);
SDL_BlitSurface(balle, NULL, ecran2, &positionBalle);
SDL_FreeSurface (balle);
SDL_BlitSurface(rectangle, NULL, ecran2, &positionRectangle);
SDL_FreeSurface (rectangle);
// SDL_Flip(ecran2);

while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
*Fin=true;
break;
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE)
{
*Fin=true;
}
if(event.key.keysym.sym == SDLK_F1)
{
SDL_SaveBMP(ecran2,"defaut.bmp");// cadeau
}
if(event.key.keysym.sym == SDLK_F2)
{
Gu=true;// ça te demmare le jeu
}
if(event.key.keysym.sym == SDLK_UP)
{
positionRectangle.y-= fps/vitesse;
if(positionRectangle.y<0)
{
positionRectangle.y+=fps/vitesse;
}
}
if(event.key.keysym.sym == SDLK_DOWN)
{
positionRectangle.y+=fps/vitesse;
if(positionRectangle.y>HAUT_ECRAN-60)
{
positionRectangle.y-=fps/vitesse;
}

}
if(event.key.keysym.sym == SDLK_RIGHT)
{
positionRectangle.x+= fps/vitesse;
if(positionRectangle.x>LARG_ECRAN/2-30)
{
positionRectangle.x-=fps/vitesse;
}
}
if(event.key.keysym.sym == SDLK_LEFT)
{
positionRectangle.x-= fps/vitesse;
if(positionRectangle.x<0)
{
positionRectangle.x+=fps/vitesse;
}
}
break;
}
}
if (point == 0)
{
*Fin=true;
}
}
/* c'est pas tout à fait ce qu'il faudrait faire mais ce sera déjà mieux */
/* le probléme est toujours là mais il vaut mieux que tu le trouves par toi meme*/

</sdl_image.h></time.h>
0
jilou2008 Messages postés 9 Date d'inscription samedi 7 février 2009 Statut Membre Dernière intervention 3 mars 2012
16 mars 2009 à 23:25
merçi d avoir repondu c est vrai qui faut s y connaitre pour povoir tous comprendre moi je debute et je n ai pas encore vu les collision et non plus la vitesse a part gettick pour deplacer seul la balle mais rien de bien complique et je crois que ce je voudrais faire faut avoir plus de conaissance mais qui ne risque rien n a rien, le seul defaut ici c est que pour coller un project c est pas evident surtout pour le lire apres mais merci pour ton aide je vai essayer de suivre tes conseils a+
0
kan64 Messages postés 3 Date d'inscription mardi 11 novembre 2008 Statut Membre Dernière intervention 17 mars 2009
17 mars 2009 à 15:26
j'espère que tu as pu déployer le code dans ton compilo sur le forum on y comprend rien ,
le formatage du texte c'est mal passé .
tu utilises quel compilateur ?
0
jilou2008 Messages postés 9 Date d'inscription samedi 7 février 2009 Statut Membre Dernière intervention 3 mars 2012
24 mars 2009 à 19:52
bonsoir kan 64 , j ai fait un copier coller sous vc++ puis compiler le programme que tu m a donner pas de probleme il fonctionne bien a part qu il faut encore ameliore pour que l adversaire ne gagne pas tjs j ai pense a faire qu on puisse jouer a 2 comme ca c est pas tjs le meme qui gagne , j ai voulu changer mon programme en prenant des partie du tiens et surtout en fesant differents fichier un fichier.h et un pour les fonctions mais il me met erreur quand il rencontre "bool" alors je me demandais si c etait seulement reconnu en c++ car ton programme quand je l ai coller c est mis automatiquement en c++ et fonctionne et moi comme je ne suis pas encore a ce niveau je suis tjs en c est ce pourrais etre le probleme, et encore une chose j ai voulu ecrire avec sdl-ttf , j ai meme fait a part le programme du cours mais quand je compile aucune faute mais a l execution il se plante j ai regarde si j avais bien mis les fichiers necessaire dans le project et aussi dans include et lib de vc++ mais il sont bien installer je ne comprends pas pour sdl_image je l ai laisse car j ai ete recherche une image de balle de tennis pour faire plus jolis, si tu peux me renseigner sur mes 2 problemes cela serait gentil de ta part je ne demande pas tous les reponse mais savoir ou je me trompe passe une bonne soiree a+
0
Rejoignez-nous