-
vautrin33u authoredvautrin33u authored
logique.c 8.78 KiB
/**
* \file logique.c
* \brief Module des fonctions gérant la logique du jeu
* \author Guillaume Vautrin
* \version 1.0
* \date 23 Sept 2020
*/
#include "logique.h"
void init_data(world_t * world){ //faux
//Etat de début de partie
world->gameover = 0;
world->compteur_plats = 0;
world->score = 0;
world->attente = 0;
//Initialise le sprite du joueur en haut à gauche de l'écran, en état 0
//init_sprite(&world->joueur, SCREEN_WIDTH*0.1, SCREEN_HEIGHT*0.1, SIZE_JOUEUR, SIZE_JOUEUR, SIZE_JOUEUR/2, 0);
//Charge la carte
world->level = init_map();
world-> map = world->level;
/*
init_sprite(&world->ship, SCREEN_WIDTH/2, SCREEN_HEIGHT-SHIP_SIZE, SHIP_SIZE, SHIP_SIZE, MOVING_STEP);
init_enemies(world);
//init_sprite(&world->ennemy, SCREEN_WIDTH/2, SCREEN_HEIGHT-SCREEN_HEIGHT+SHIP_SIZE, SHIP_SIZE, SHIP_SIZE, ENNEMY_SPEED);
init_sprite(&world->missile, (SCREEN_WIDTH+ SHIP_SIZE)/2, SCREEN_HEIGHT-(SHIP_SIZE+MISSILE_SIZE), MISSILE_SIZE, MISSILE_SIZE, MISSILE_SPEED);
set_invisible(&world->missile);
*/
}
void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state){ //faux
//La fonction initialise tous les composants d'un sprite
sprite->x = x;
sprite->y = y;
sprite->w = w;
sprite->h = h;
sprite->v = v;
sprite->etat = state;
sprite->is_visible = 0;
sprite->nom = nom;
}
int aleatoire (int a, int b){
// Fonction générant une valeur aléatoire entre a (inclu) et b (exclu)
return rand()%(b-a)+a;
}
void set_bas (sprite_t *sprite){
// Sprite va vers le bas
sprite->etat = 0;
}
void set_haut (sprite_t *sprite){
// Sprite va vers le haut
sprite->etat = 1;
}
void set_droite (sprite_t *sprite){
// Sprite va vers la droite
sprite->etat = 2;
}
void set_gauche (sprite_t *sprite){
// Sprite va vers la gauche
sprite->etat = 3;
}
int return_state (sprite_t *sprite){
//Retourne l'état du sprite
return sprite->etat;
}
void set_visible (sprite_t *sprite){
// Permet de rendre visible un sprite
sprite->is_visible=0;
}
void set_invisible (sprite_t *sprite){
// Permet de rendre invisible un sprite
sprite->is_visible=1;
}
int estFini(world_t *world){
//Défini si le jeu est terminé
return world->gameover;
}
void limites_externes (sprite_t *sprite, world_t *world){
//Défini les limites selon les murs
if (sprite->x > (SCREEN_WIDTH*0.9)){
//mur droite
sprite->x = (SCREEN_WIDTH*0.9) - sprite->w/2;
}
if (sprite->x < (SCREEN_WIDTH*0.1)){
//mur gauche
sprite->x = (SCREEN_WIDTH*0.1);
}
if (sprite->y > (SCREEN_HEIGHT*0.9)){
//mur bas
sprite->y = (SCREEN_HEIGHT*0.9) - sprite->w/2;
}
if (sprite->y < (SCREEN_HEIGHT*0.1)){
//mur haut
sprite->y = (SCREEN_HEIGHT*0.1);
}
}
void reset_sprite_on_map (sprite_t *sprite, world_t *world){
//On efface la position du joueur sur map
for (int i=0; i<SCREEN_HEIGHT; i++){
for (int j=0; j<SCREEN_WIDTH; j++){
if (world->map[i][j]== sprite->nom){
world->map[i][j] = ' ';
}
}
}
}
void place_sprite_on_map (sprite_t *sprite, world_t *world){
//on écrit la position du joueur sur la map
for (int i=sprite->y; i < sprite->y + sprite->h ; i++){
for (int j = sprite->x ; j < sprite->x + sprite->w ; j++){
world->map[i][j]= sprite->nom;
}
}
}
void deplace_sprite (sprite_t *sprite, world_t *world){
//permet de déplacer le sprite et de corriger les données de map de manière cohérente
reset_sprite_on_map(sprite, world);
int compteur;
switch (return_state(sprite)){
case 0:
//déplace vers le bas
sprite->y += sprite->v;
if (world->map[sprite->y + SIZE_JOUEUR][sprite->x] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x + SIZE_JOUEUR] != ' '){
//Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
for (int y= sprite->y; y<SIZE_JOUEUR; y++){
if (world->map[y][sprite->x] == ' '){
compteur++;
}
}
sprite->x -= compteur;
}
break;
case 1:
//déplace vers le haut
sprite->y -= sprite->v;
if (world->map[sprite->y][sprite->x] != ' ' || world->map[sprite->y][sprite->x + SIZE_JOUEUR] != ' '){
//Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
for (int y= sprite->y; y<SIZE_JOUEUR; y++){
if (world->map[y][sprite->x] != ' '){
compteur++;
}
}
sprite->x += compteur;
}
break;
case 2:
//déplace vers la droite
sprite->x += sprite->v;
if (world->map[sprite->y][sprite->x + SIZE_JOUEUR] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x + SIZE_JOUEUR] != ' '){
//Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
for (int x= sprite->x; x<SIZE_JOUEUR; x++){
if (world->map[sprite->y][x] == ' '){
compteur++;
}
}
sprite->x -= compteur;
}
break;
case 3:
//déplace vers la gauche
sprite->x -= sprite->v;
if (world->map[sprite->y][sprite->x] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x] != ' '){
//Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
for (int x= sprite->x; x<SIZE_JOUEUR; x++){
if (world->map[sprite->y][x] != ' '){
compteur++;
}
}
sprite->x += compteur;
}
break;
}
limites_externes(sprite, world);
place_sprite_on_map(sprite, world);
}
void gestion_events(SDL_Event *event, world_t *world){
SDL_PollEvent(event);
switch(event->type){
case SDL_QUIT:
world->gameover = 1; break;
case SDL_KEYDOWN:
switch(event->key.keysym.sym){
case SDLK_ESCAPE:
world->gameover = 1; break;
//Déplacement du joueur
case SDLK_z:
set_haut(&world->joueur);
break;
case SDLK_s:
set_bas(&world->joueur);
break;
case SDLK_d:
set_droite(&world->joueur);
break;
case SDLK_q:
set_gauche(&world->joueur);
break;
//case SDLK_SPACE:
}
}
}
char** init_map (){
const char* nomFichier = "Ressources/map.txt";
int hauteur = SCREEN_HEIGHT;
int largeur = SCREEN_WIDTH;
char** tab = allouer_tab_2D(hauteur, largeur);
for (int i=0; i<hauteur; i++){
for (int j=0; j<largeur; j++){
tab[i][j] = ' '; //Rempli les zones accessibles avec un espaces
//Limites extérieures du terrain remplis avec 'X'
if (j<= largeur*0.1 || j>= largeur*0.9 || i<= hauteur*0.1 || i>= hauteur*0.9){
tab[i][j] = 'X';
}
// Zone de déplacement interdit au joueurs; zones de travail:
if((j>largeur*0.1 && j<largeur*0.2 && i>hauteur*0.1 && i<hauteur*0.6) || (j>largeur*0.1 && j<=largeur*0.5 && i>hauteur*0.1 && i<hauteur*0.2 ) || (j>largeur*0.5 && j<largeur*0.6 && i>hauteur*0.1 && i<hauteur*0.4)){
tab[i][j] = 'P';
}
//Emplacement du frigo
if (j>largeur*0.1 && j<largeur*0.4 && i>hauteur*0.7 && i<hauteur*0.9){
tab[i][j] = 'F';
}
//Emplacement des fourneaux
if (j>largeur*0.8 && j<largeur*0.9 && i>hauteur*0.1 && i<hauteur*0.4){
tab[i][j] = 'f';
}
//Emplacement du lavabo
if (j>largeur*0.5 && j<largeur*0.8 && i>hauteur*0.8 && i<hauteur*0.9){
tab[i][j] = 'L';
}
//Zone d'envoi
if (j>=largeur*0.9 && j<largeur && i>hauteur*0.5 && i<hauteur*0.7){
tab[i][j] = 'e';
}
//Poubelle
if (j>largeur*0.8 && j<largeur*0.9 && i>hauteur*0.8 && i<hauteur*0.9){
tab[i][j] = 't';
}
}
}
genere_fichier(nomFichier, tab, hauteur, largeur);
return tab;
}
void update_data (world_t *world){
const char *nomSave = "Ressouces/save.txt";
genere_fichier(nomSave, world->map, SCREEN_HEIGHT, SCREEN_WIDTH);
}