Salut a tous les créateurs de jeux
Je code en C avec la SDL et j'ai un soucis avec les collisions.
J'ai créer un programme ou on dirige un carré, et si on ne doit pas passer a travers un petit mur, bref, un truc simple pour tester les collisions.
Je vous explique : j'ai mon algorithme de collision fonctionnel mais lorsque il y a collision, ca bloque, je ne peux plus bouger mon carré, ce n'est pas un plantage.
Voila le code, j'espere que vous pourrez m'aider
- include <stdio.h>
- include <stdlib.h>
- include <sdl.h>
bool collisionAABB(SDL_Rect box1, SDL_Rect box2);
int main (int argc, char** argv)
{
SDL_Init(SDL_INIT_VIDEO);
SDL_Surface *ecran = SDL_SetVideoMode(500, 500, 32, SDL_HWSURFACE || SDL_DOUBLEBUF);
SDL_Surface *perso = SDL_LoadBMP("perso.bmp");
SDL_Surface *barre = SDL_LoadBMP("barre.bmp");
SDL_Rect positionBarre;
positionBarre.x = (500/2)-(barre->w/2);
positionBarre.y = (500/2)-(barre->h/2);
positionBarre.w = barre->w;
positionBarre.h = barre->h;
SDL_Rect positionPerso;
positionPerso.x = 0;
positionPerso.y = 0;
positionPerso.w = perso->w;
positionPerso.h = perso->h;
SDL_Event event;
int continuer = 1;
while (continuer)
{
SDL_PollEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_DOWN:
if (positionPerso.y > (500-perso->w))
break;
if(collisionAABB(positionBarre, positionPerso) == true)
break;
positionPerso.y++;
break;
case SDLK_UP:
if(collisionAABB(positionBarre, positionPerso) == true)
break;
positionPerso.y--;
break;
case SDLK_LEFT:
if(collisionAABB(positionBarre, positionPerso) == true)
break;
positionPerso.x--;
break;
case SDLK_RIGHT:
if (positionPerso.x > (500-perso->h))
break;
if(collisionAABB(positionBarre, positionPerso) == true)
break;
positionPerso.x++;
break;
}
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
SDL_BlitSurface(barre, NULL, ecran, &positionBarre);
SDL_BlitSurface(perso, NULL, ecran, &positionPerso);
SDL_Flip(ecran);
}
SDL_FreeSurface(barre);
SDL_FreeSurface(perso);
SDL_Quit();
}
bool collisionAABB(SDL_Rect box1, SDL_Rect box2)
{
if((box2.x >= box1.x + box1.w) ||
(box2.x + box2.w <= box1.x) ||
(box2.y >= box1.y + box1.h) ||
(box2.y + box2.h <= box1.y))
return false;
else
return true;
}