Bonjour a tous,
enfaite j'essaye de faire un casse-brique avec SDL en C, pour l'instant il est loin d'etre fini et n'est pas optimiser c juste un test.
La ou est mon probleme est que pour l'instant je ne peux pas deplacer la barre si la balle a du effectuer un rebond .
exemple pour l'instant quand le jeu demarre la balle par vers la gauche, dc elle doit continuer tant qu'elle ne rencontre pas d'obstacle ensuite si elle rencontre le rebord gauche ici elle se dirrige vers le rebord d'en hau ensuite elle redescend le prob est tant que la balle n'as pas fait ca je ne peux pas bouger la barre :( voici mon code :
#include <stdio.h>
#include <stdlib.h>
#include<SDl.h>
struct objet
{
SDL_Surface *image;
int x,y;
}barre,brique1,brique2,brique3,balle;
SDL_Surface *screen;
int InitImage()
{
barre.image=SDL_LoadBMP("raquette.bmp");
balle.image=SDL_LoadBMP("balle.bmp");
}
void DrawIMG(struct objet*obj)
{
SDL_Rect dest;
dest.x=obj->x;
dest.y=obj->y;
SDL_BlitSurface((*obj).image,NULL,screen,&dest);
}
void DrawScene()
{
DrawIMG(&barre);
DrawIMG(&balle);
SDL_Flip(screen);
}
/*fonction qui s'oocupe des evenement lié au clavier pour le deplacement de la barre*/
static void deplacement(struct objet *obj)
{
Uint8* keys;
keys = SDL_GetKeyState(NULL);
if ( keys[SDLK_LEFT] ) { if(barre.x>10)barre.x=barre.x-4; }
if ( keys[SDLK_RIGHT] ) { if(barre.x<500)barre.x=barre.x+4;}
DrawScene();
}
/*si la balle touche un rebord du jeu */
void rebord(struct objet *ball)
{
if(ball->x<10)
{
while(1)
{
ball->x++;
ball->y--;
DrawScene();
if(ball->y<10)
{break;}
}
}
if(ball->y<10)
{
while(1)
{
ball->x++;
ball->y++;
DrawScene();
if(ball->y>430)
{break;}
}
}
}
si la balle touche le coté droit*/
void contactdroit(struct objet *obj,struct objet *ball)
{
while(1)
{
ball->x++;
ball->y--;
DrawScene();
if(ball->x>600)
{ rebord(&balle);break;}
}
}
/*si elle touche le coté gauche*/
void contactgauche(struct objet *obj,struct objet *ball)
{
while(1)
{
ball->x--;
ball->y--;
DrawScene();
if(ball->x<10)
{ rebord(&balle);break;}
}
}
/*si la balle touche la barre (elle n'est pas totalement exact*/
void position(struct objet*obj,struct objet *ball)
{
if((balle.x-barre.x<=50)||(balle.x-barre.x<=50))
{if(barre.y-balle.y<=24)
contactgauche(&barre,&balle);}
if((balle.x-barre.x>=50)&&(balle.x-barre.x<=70))
{ if(barre.y-balle.y<=24)
contactdroit(&barre,&balle);
}
}
int main(int argc, char *argv[])
{
barre.x=260;
barre.y=450;
balle.x=300;
balle.y=426;
Uint8* keys;
if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
{
printf("Unable to init SDL: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN);
if ( screen == NULL )
{
printf("Unable to set 640x480 video: %s\n", SDL_GetError());
exit(1);
}
InitImage();
/* DrawBG();*/
int done=0;
while(done == 0)
{
SDL_Event event;
while ( SDL_PollEvent(&event) )
{
if ( event.type == SDL_QUIT ) { done = 1; }
if ( event.type == SDL_KEYDOWN )
{
if ( event.key.keysym.sym == SDLK_ESCAPE ) { done = 1; }
}
}
while(1)
{
deplacement(&barre);
DrawScene();
position(&barre,&balle);
DrawScene();
/* deplacement(&barre);*/
/*rebord(&balle);*/
/*deplacement(&barre);*/
DrawScene();
if(balle.x>500)break;/*si la balle est plus loin ke le bord de l'ecran*/
}
}
return 0;
}