Si c'était aussi simple, je n'aurais pas posté
, sinon voici le code:
- include<stdio.h>
- include<stdlib.h>
- include<string.h>
- include "const.h"
- include<SDL.h>
- include <SDL_image.h>
//bool Collision(AABB box1,AABB box2);
int Collision(SDL_Rect box1, SDL_Rect box2);
int main(int argc, char *argv[])
{
int mort = 0;
SDL_Surface *cadre = NULL, *advActuel = NULL, *ecran = NULL, *app = NULL, *marioActuel = NULL, *mur = NULL, *caisse = NULL, *fond = NULL, *vide = NULL, *Jouer = NULL, *Ecrire = NULL;
SDL_Surface *mario[5] = {NULL}; // 5 surfaces pour chacune des directions de mario
SDL_Surface *adv[4] = {NULL}; //ennemi
SDL_Rect pos, posFond, posCaisse, poscaisse, posVide, posJouer, posCadre, posMur, posEnnemi, souris;
int continuer = 1;
int compteur = 0;
SDL_Event event;
SDL_Init(SDL_INIT_VIDEO | SDL_DOUBLEBUF);
/*fond = IMG_Load("menu.jpg");*/
mario[HAUT] = IMG_Load("mario_haut.gif");
mario[BAS] = IMG_Load("mario_bas.gif");
mario[DROITE] = IMG_Load("mario_droite.gif");
mario[GAUCHE] = IMG_Load("mario_gauche.gif");
mario[SAUT] = IMG_Load("mario_saut.gif");
adv[HAUT] = IMG_Load ("enn_haut.gif");
adv[BAS] = IMG_Load("enn_bas.gif");
adv[DROITE] = IMG_Load("enn_droite.gif");
adv[GAUCHE] = IMG_Load("enn_gauche.gif");
mur = IMG_Load("mur.jpeg");
cadre = IMG_Load("cadre_texte.png");
ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
SDL_WM_SetCaption("Demo SDL", NULL);
SDL_EnableKeyRepeat(10, 10);
marioActuel = IMG_Load("mario_bas.gif");
posCaisse.x = 72;
posCaisse.y = 72;
pos.x = 275;
pos.y = 0;
posMur.x = 0;
posMur.y = 112;
posEnnemi.y = 200;
posEnnemi.x = 100;
posCadre.y = 340;
posCadre.x = 10;
while (continuer)
{
SDL_PollEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_a:
exit(EXIT_SUCCESS);
break;
case SDLK_c:
caisse = IMG_Load("caisse.jpg");
/*if (caisse != NULL)
{
SDL_Delay(1000);
caisse = NULL;
}*/
break;
// Deplacement de la caisse
if (caisse != NULL)
{
case SDLK_s:
posCaisse.x--;
posCaisse.x--;
break;
case SDLK_d:
posCaisse.y++;
posCaisse.y++;
break;
case SDLK_f:
posCaisse.x++;
posCaisse.x++;
break;
case SDLK_e:
posCaisse.y--;
posCaisse.y--;
break;
case SDLK_x:
posCaisse.x--;
posCaisse.y++;
break;
case SDLK_v:
posCaisse.x++;
posCaisse.y++;
break;
case SDLK_w:
posCaisse.x--;
posCaisse.y--;
break;
case SDLK_r:
posCaisse.x++;
posCaisse.y--;
break;
}
break;
case SDLK_UP:
if (pos.y - 1 < 0)
break;
if(Collision(pos, posEnnemi)==0)
break;
marioActuel = mario[HAUT];
pos.y--;
pos.y--;
break;
case SDLK_LEFT:
if (pos.x - 1 < 0)
break;
if(Collision(pos, posEnnemi)==0)
break;
marioActuel = mario[GAUCHE];
pos.x--;
pos.x--;
break;
case SDLK_RIGHT:
if (pos.x + 1 > 610)
break;
if(Collision(pos, posEnnemi)==0)
break;
marioActuel = mario[DROITE];
pos.x++;
pos.x++;
break;
case SDLK_DOWN: // Flèche bas
if (pos.y + 1 > 300)
break;
if(Collision(pos, posEnnemi)==0)
break;
marioActuel = mario[BAS];
pos.y++;
pos.y++;
break;
break;
}
break;
}
if (mort)
{
system("pause");
exit(EXIT_SUCCESS);
}
//On met a jour la position de l'ennemi
if(posEnnemi.y > pos.y)
advActuel = adv[HAUT];
if (posEnnemi.y < pos.y)
advActuel = adv[BAS];
if(posEnnemi.x > pos.x)
advActuel = adv[GAUCHE];
if (posEnnemi.x < pos.x)
advActuel = adv[DROITE];
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
SDL_BlitSurface(advActuel, NULL, ecran, &posEnnemi);
SDL_BlitSurface(cadre, NULL, ecran, &posCadre);
SDL_BlitSurface(caisse, NULL, ecran, &posCaisse);
SDL_BlitSurface(marioActuel, NULL, ecran, &pos);
SDL_BlitSurface(app, NULL, ecran, &posVide);
SDL_BlitSurface(mur, NULL, ecran, &posMur);
SDL_Flip(ecran); /* On met à jour l'affichage */
SDL_BlitSurface(fond, NULL, ecran, &posFond);
}
SDL_FreeSurface(app);
SDL_Quit();
return EXIT_SUCCESS;
}
/*bool Collision(AABB box1,AABB box2)
{
if((box2.x >= box1.x + box1.w) // trop à droite
|| (box2.x + box2.w <= box1.x) // trop à gauche
|| (box2.y >= box1.y + box1.h) // trop en bas
|| (box2.y + box2.h <= box1.y)) // trop en haut
return false;
else
return true;
}*/
int Collision(SDL_Rect box1, SDL_Rect box2)
{
if((box2.x >= box1.x + 16) // trop à droite
|| (box2.x + 16 <= box1.x) // trop à gauche
|| (box2.y >= box1.y + 28) // trop en bas
|| (box2.y + 28 <= box1.y)) // trop en haut
return 1;
else
return 0;
}
La fonction ci-dessus ne fonctionne pas (enfin si mais je ne peux plus bouger dès que je touche le mario vert).