#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
#include "constantes.h"
#include "jeu.h"
void jouer(SDL_Surface *ecran)
{
SDL_Surface *CubeBleu = NULL, *CubeNoir = NULL, *CubeBlanc = NULL, *CubeRouge = NULL;
SDL_Rect position, positionJoueur;
SDL_Event event;
int continuer = 1, objectifAtteint = 0, i = 0, j = 0;
int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
// Chargement des sprites (décors, personnage...)
CubeBlanc = IMG_Load("CubeBlanc.bmp");
CubeNoir = IMG_Load("CubeNoir.bmp");
CubeBleu = IMG_Load("CubeBleu.bmp");
CubeRouge = IMG_Load("CubeRouge.bmp");
// Chargement du niveau
if (!chargerNiveau(carte))
exit(EXIT_FAILURE); // On arrête le jeu si on n'a pas pu charger le niveau
// Recherche de la position de Mario au départ
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
if (carte[i][j] == CubeBleu) // Si CubeBleu se trouve à cette position sur la carte
{
positionJoueur.x = i;
positionJoueur.y = j;
carte[i][j] = CubeBlanc;
}
}
}
// Activation de la répétition des touches
SDL_EnableKeyRepeat(100, 100);
while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_ESCAPE:
continuer = 0;
break;
case SDLK_UP:
deplacerJoueur(carte, &positionJoueur, HAUT);
break;
case SDLK_DOWN:
deplacerJoueur(carte, &positionJoueur, BAS);
break;
case SDLK_RIGHT:
deplacerJoueur(carte, &positionJoueur, DROITE);
break;
case SDLK_LEFT:
deplacerJoueur(carte, &positionJoueur, GAUCHE);
break;
}
break;
}
// Effacement de l'écran
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
// Placement des objets à l'écran
objectifAtteint = 0;
for (i = 0 ; i < NB_BLOCS_LARGEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_HAUTEUR ; j++)
{
position.x = i * TAILLE_BLOC;
position.y = j * TAILLE_BLOC;
switch(carte[i][j])
{
case CUBEBLANC:
SDL_BlitSurface(CubeBlanc, NULL, ecran, &position);
break;
case CUBEBLEU:
SDL_BlitSurface(CubeBleu, NULL, ecran, &position);
break;
case CUBENOIR:
SDL_BlitSurface(CubeNoir, NULL, ecran, &position);
break;
case CUBEROUGE:
SDL_BlitSurface(CubeRouge, NULL, ecran, &position);
objectifAtteint = 1;
break;
}
}
}
// Si on n'a trouvé aucun objectif sur la carte, c'est qu'on a gagné
if (!objectifAtteint)
continuer = 0;
// On place le joueur à la bonne position
position.x = positionJoueur.x * TAILLE_BLOC;
position.y = positionJoueur.y * TAILLE_BLOC;
SDL_BlitSurface(CubeBleu, NULL, ecran, &position);
SDL_Flip(ecran);
}
// Désactivation de la répétition des touches (remise à 0)
SDL_EnableKeyRepeat(0, 0);
// Libération des surfaces chargées
SDL_FreeSurface(CubeBlanc);
SDL_FreeSurface(CubeBleu);
SDL_FreeSurface(CubeNoir);
SDL_FreeSurface(CubeRouge);
}
void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction)
{
switch(direction)
{
case HAUT:
while (!(carte[pos->x][pos->y -1] == CUBENOIR )||(pos->y - 1 >= 0))
{
// Si on arrive là, c'est qu'on peut déplacer le joueur !
deplacerCube(&carte[pos->x][pos->y - 1], &carte[pos->x][pos->y - 2]);
pos->y--;
} // On peut enfin faire monter le joueur (oufff !)
break;
case BAS:
while (!(carte[pos->x][pos->y+1]== CUBENOIR) || (pos->y + 1 < NB_BLOCS_HAUTEUR))
{
deplacerCube(&carte[pos->x][pos->y + 1], &carte[pos->x][pos->y + 2]);
pos->y++;
}
break;
case GAUCHE:
while (!(carte[pos->x -1][pos->y] == CUBENOIR) || (pos->x - 1 >= 0))
{
deplacerCube(&carte[pos->x - 1][pos->y], &carte[pos->x - 2][pos->y]);
pos->x--;
}
break;
case DROITE:
while (!(carte[pos->x + 1][pos->y] == CUBENOIR) || (pos->x + 1 < NB_BLOCS_LARGEUR ))
deplacerCube(&carte[pos->x + 1][pos->y], &carte[pos->x + 2][pos->y]);
pos->x++;
break;
}
}
void deplacerCube(int *premiereCase, int *secondeCase)
{
if (*premiereCase == CUBEBLEU )
{
if (*secondeCase == CUBEROUGE)
;
else
*secondeCase = CUBEBLEU;
if (*premiereCase == CUBEBLEU)
*premiereCase = CUBEBLANC;
}
}
Partager