Commit bc1ba571 authored by vautrin33u's avatar vautrin33u
Browse files

Nouvelle structure de données pour gérer les plats et ingrédients et score

parent 0bd61512
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -11,6 +11,7 @@
//enum état pour décrire la direction du sprite
enum etat {BAS, HAUT, DROITE, GAUCHE, MOBILE, FIXE};
enum cuisson {FRIGO, FRAIS, SALE, PROPRE, CUIT};
/**
* \brief Largeur de l'écran
......@@ -25,7 +26,7 @@ enum etat {BAS, HAUT, DROITE, GAUCHE, MOBILE, FIXE};
/**
* \brief Titre
* */
#define TITRE "Jeu"
#define TITRE "Cookin' Up"
/**
* \brief Nombre de types de plats
......@@ -37,6 +38,92 @@ enum etat {BAS, HAUT, DROITE, GAUCHE, MOBILE, FIXE};
* */
#define NB_INGREDIENT 6
/**
* @brief Nom du joueur
*/
#define NOM_JOUEUR 'J'
/**
* @brief Nom du frigo
*
*/
#define NOM_FRIGO 'F'
/**
* @brief Nom des fourneaux
*
*/
#define NOM_FOUR 'f'
/**
* @brief Nom du lavabo
*
*/
#define NOM_LAVABO 'L'
/**
* @brief Nom de la zone d'envoi
*/
#define NOM_ENVOI 'e'
/**
* @brief Nom de la poubelle
*/
#define NOM_POUBELLE 't'
/**
* @brief Nom des tomates
*/
#define NOM_TOMATE 'z'
/**
* @brief Nom du pain
*
*/
#define NOM_PAIN 'y'
/**
* @brief Nom des steaks
*
*/
#define NOM_STEAK 'x'
/**
* @brief Nom de la salade
*
*/
#define NOM_SALADE 'w'
/**
* @brief Nom du fromage
*
*/
#define NOM_FROMAGE 'v'
/**
* @brief Nom des cornichons
*
*/
#define NOM_CORNICHON 'u'
/**
* @brief Marqueur permettant de reconnaître les blocs des comptoires
*
*/
#define MARQUEUR_COMPT 'P'
/**
* @brief Nom des blocs de comptoires
*
*/
#define NOM_COMPT 'p'
/**
* @brief Quantité de chaque ingrédient dans les stocks
*
*/
#define QTE_STOCK 10
/**
* \brief taille joueur
* */
......
......@@ -8,25 +8,23 @@
#include "logique.h"
void init_data(world_t * world){ //faux
void init_data(world_t * world){
//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, 'J', 200, 200, SIZE_JOUEUR, SIZE_JOUEUR, 10, BAS);
init_sprite(&world->joueur, NOM_JOUEUR, 200, 200, SIZE_JOUEUR, SIZE_JOUEUR, 10, BAS);
//Charge la carte
world->map = init_map();
//Complète automatiquement les positions d'un meuble unique sur la map
build_sprite_unique(&world->frigo, 'F', FRIGO_LARGEUR, FRIGO_HAUTEUR, world->map);
build_sprite_unique(&world->four, 'f', FOUR_LARGEUR, FOUR_HAUTEUR, world->map);
build_sprite_unique(&world->lavabo, 'L', LAVABO_LARGEUR, LAVABO_HAUTEUR, world->map);
build_sprite_unique(&world->poubelle, 't', POUBELLE_LARGEUR, POUBELLE_HAUTEUR, world->map);
build_sprite_unique(&world->envoi, 'e', ZONE_ENVOI_LARGEUR, ZONE_ENVOI_HAUTEUR, world->map);
build_sprite_unique(&world->frigo, NOM_FRIGO, FRIGO_LARGEUR, FRIGO_HAUTEUR, world->map);
build_sprite_unique(&world->four, NOM_FOUR, FOUR_LARGEUR, FOUR_HAUTEUR, world->map);
build_sprite_unique(&world->lavabo, NOM_LAVABO, LAVABO_LARGEUR, LAVABO_HAUTEUR, world->map);
build_sprite_unique(&world->poubelle, NOM_POUBELLE, POUBELLE_LARGEUR, POUBELLE_HAUTEUR, world->map);
build_sprite_unique(&world->envoi, NOM_ENVOI, ZONE_ENVOI_LARGEUR, ZONE_ENVOI_HAUTEUR, world->map);
int n_sprite = 1;
for (int k=0; k<NB_COMPT_1; k++){
init_sprite(&world->comptoire[k], '0', 1, 1, 1, 1,0,BAS);
......@@ -38,8 +36,33 @@ void init_data(world_t * world){ //faux
temp = get_rect(&world->frigo); // Récupère la position du frigo pour placer les ingrédients dedans
init_sprite(&world->tomates[i], 'r', temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, BAS);
//set_invisible(&world->tomates[i]);
}
}
init_stocks(&world->etat_stocks, world);
}
void init_plat (plat_t* plat, char nom, int x, int y, int w, int h, int v, int state){
init_sprite(&plat->ingredient, nom, x, y, w, h, v, state);
set_cuisson(plat, FRIGO);
}
void init_stocks(stock_t* stocks, world_t *world){
//Initialisation des stocks et du tableau d'état des menus
stocks->score = 0;
for (int y=0; y<NB_PLAT; y++){
for (int x=0; x<NB_INGREDIENT; x++){
stocks->plats[y][x] = 0;
}
}
SDL_Rect temp = get_rect(&world->frigo);
for (int i=0; i<QTE_STOCK; i++){
init_plat(&stocks->stock_tomate[i], NOM_TOMATE, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, BAS);
init_plat(&stocks->stock_pain[i], NOM_PAIN, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, BAS);
init_plat(&stocks->stock_steak[i], NOM_STEAK, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, BAS);
init_plat(&stocks->stock_salade[i], NOM_SALADE, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, BAS);
init_plat(&stocks->stock_fromage[i], NOM_SALADE, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, BAS);
init_plat(&stocks->stock_cornichon[i], NOM_CORNICHON, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, BAS);
}
}
void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state){
......@@ -124,6 +147,24 @@ SDL_Rect get_rect (sprite_t *sprite){
return sprite->rect;
}
sprite_t* get_sprite (plat_t *plat){
return &plat->ingredient;
}
int get_cuisson (plat_t *plat){
return plat->cuisson;
}
void set_cuisson(plat_t *plat, int cuisson){
plat->cuisson = cuisson;
}
void modif_position (sprite_t *sprite, int x_move, int y_move){
//Ajoute les valeurs à la position actuelle d'un sprite
sprite->rect.x += x_move;
sprite->rect.y += y_move;
}
int has_collided (sprite_t* spr1, sprite_t* spr2){
return SDL_HasIntersection(&spr1->rect, &spr2->rect);
}
......@@ -136,22 +177,23 @@ void handle_collision (sprite_t* spr_move, sprite_t* spr_fixed){
switch (return_state(spr_move)){
case BAS:
//cas dans lequel le joueur descend 'à travers' un meuble
spr_move->rect.y -= temp.h;
//spr_move->rect.y -= temp.h;
modif_position(spr_move, 0, -temp.h);
break;
case HAUT:
//cas dans lequel le joueur va 'à travers' un meuble vers le haut
spr_move->rect.y += temp.h;
modif_position(spr_move, 0, temp.h);
break;
case DROITE:
//cas dans lequel le joueur va 'à travers' un meuble vers la droite
spr_move->rect.x -= temp.w;
modif_position(spr_move, -temp.w, 0);
break;
case GAUCHE:
//cas dans lequel le joueur va 'à travers' un meuble vers la gauche
spr_move->rect.x += temp.w;
modif_position(spr_move, temp.w, 0);
break;
}
//printf("x = %d, y= %d, h = %d, w= %d \n", temp.x, temp.y, temp.h, temp.w);
......@@ -216,17 +258,14 @@ void limites_externes (sprite_t *sprite){
//mur droite
sprite->rect.x = SCREEN_WIDTH - (SIZE_MUR + sprite->rect.w);
}
if (sprite->rect.x < SIZE_MUR){
//mur gauche
sprite->rect.x = SIZE_MUR;
}
if (sprite->rect.y + sprite->rect.h > SCREEN_HEIGHT-SIZE_MUR){
//mur bas
sprite->rect.y = SCREEN_HEIGHT - (SIZE_MUR + sprite->rect.h);
}
if (sprite->rect.y < SIZE_MUR){
//mur haut
sprite->rect.y = SIZE_MUR;
......@@ -246,8 +285,8 @@ void limites_interne (world_t* world){
}
void reset_sprite_on_map (sprite_t *sprite, world_t *world){
//On efface la position du joueur sur map
void reset_sprite_on_map (sprite_t *sprite, world_t *world){ // TODO: A retravailler pour les plats et joueur
//On efface la position du sprite sur map
for (int i=sprite->rect.y; i < sprite->rect.y + sprite->rect.h ; i++){
for (int j = sprite->rect.x ; j < sprite->rect.x + sprite->rect.w ; j++){
if (world->map[i][j]== sprite->nom){
......@@ -257,8 +296,8 @@ void reset_sprite_on_map (sprite_t *sprite, world_t *world){
}
}
void place_sprite_on_map (sprite_t *sprite, world_t *world){
//on écrit la position du joueur sur la map
void place_sprite_on_map (sprite_t *sprite, world_t *world){ //TODO: A retravailler pour les plats (sur meubles) et joueur
//on écrit la position du sprite sur la map
for (int i=sprite->rect.y; i < sprite->rect.y + sprite->rect.h ; i++){
for (int j = sprite->rect.x ; j < sprite->rect.x + sprite->rect.w ; j++){
world->map[i][j]= sprite->nom;
......@@ -267,7 +306,7 @@ void place_sprite_on_map (sprite_t *sprite, world_t *world){
}
void gestion_events(SDL_Event *event, world_t *world){
int temp = world->joueur.v;
SDL_PollEvent(event);
switch(event->type){
case SDL_QUIT:
......@@ -280,21 +319,22 @@ void gestion_events(SDL_Event *event, world_t *world){
case SDLK_UP:
set_haut(&world->joueur);
world->joueur.rect.y -= world->joueur.v;
modif_position(&world->joueur, 0, -temp);
break;
case SDLK_DOWN:
set_bas(&world->joueur);
world->joueur.rect.y += world->joueur.v;
modif_position(&world->joueur, 0, temp);
break;
case SDLK_RIGHT:
set_droite(&world->joueur);
world->joueur.rect.x += world->joueur.v;
modif_position(&world->joueur, temp, 0);
break;
case SDLK_LEFT:
set_gauche(&world->joueur);
world->joueur.rect.x -= world->joueur.v;
modif_position(&world->joueur, -temp, 0);
break;
//case SDLK_SPACE:
}
......@@ -318,35 +358,35 @@ char** init_map (){
// Zone de déplacement interdit au joueurs; zones de travail:
if((j>= SIZE_MUR && j<BLOC_COMPT_SIZE+SIZE_MUR && i>=SIZE_MUR && i<SIZE_MUR+ (3*BLOC_COMPT_SIZE)) || (j>=SIZE_MUR+BLOC_COMPT_SIZE && j<SIZE_MUR + (4*BLOC_COMPT_SIZE) && i>=SIZE_MUR && i<SIZE_MUR + BLOC_COMPT_SIZE) || (j>= SIZE_MUR + (4*BLOC_COMPT_SIZE) && j< SIZE_MUR + (5*BLOC_COMPT_SIZE) && i>= SIZE_MUR && i<SIZE_MUR + BLOC_COMPT_SIZE*3)){
tab[i][j] = 'p';
tab[i][j] = NOM_COMPT;
}
// Marqueurs pour délimité tous les éléments de travail:
if((i==SIZE_MUR && j==SIZE_MUR) || (i==SIZE_MUR && j==SIZE_MUR+BLOC_COMPT_SIZE) || (i==SIZE_MUR && j==SIZE_MUR+BLOC_COMPT_SIZE*2) || (i==SIZE_MUR && j==SIZE_MUR+BLOC_COMPT_SIZE*3) || (j== SIZE_MUR && i==SIZE_MUR+BLOC_COMPT_SIZE) || (j== SIZE_MUR &&i==SIZE_MUR+BLOC_COMPT_SIZE*2) || (j== SIZE_MUR + BLOC_COMPT_SIZE*4 && i==SIZE_MUR) || (j== SIZE_MUR + BLOC_COMPT_SIZE*4 && i == SIZE_MUR + BLOC_COMPT_SIZE) || (j== SIZE_MUR + BLOC_COMPT_SIZE*4 && i == SIZE_MUR + BLOC_COMPT_SIZE*2)){
tab[i][j] = 'P';
tab[i][j] = MARQUEUR_COMPT;
}
//Emplacement du frigo
if (j>=SIZE_MUR && j<SIZE_MUR+FRIGO_LARGEUR && i>=hauteur-(SIZE_MUR + FRIGO_HAUTEUR) && i<hauteur - SIZE_MUR){
tab[i][j] = 'F';
tab[i][j] = NOM_FRIGO;
}
//Emplacement des fourneaux
if (j>=largeur-(SIZE_MUR+FOUR_HAUTEUR) && j<largeur-SIZE_MUR && i>=SIZE_MUR && i<SIZE_MUR+FOUR_LARGEUR){
tab[i][j] = 'f';
tab[i][j] = NOM_FOUR;
}
//Emplacement du lavabo
if (j>=SIZE_MUR+(4*BLOC_COMPT_SIZE) && j<SIZE_MUR+(4*BLOC_COMPT_SIZE)+LAVABO_LARGEUR && i>=hauteur-(SIZE_MUR+BLOC_COMPT_SIZE) && i<hauteur-(SIZE_MUR+BLOC_COMPT_SIZE)+LAVABO_HAUTEUR){
tab[i][j] = 'L';
tab[i][j] = NOM_LAVABO;
}
//Zone d'envoi
if (j>=largeur-ZONE_ENVOI_LARGEUR && j<largeur && i>=SIZE_MUR+(3*BLOC_COMPT_SIZE) && i<SIZE_MUR+(3*BLOC_COMPT_SIZE)+ZONE_ENVOI_HAUTEUR){
tab[i][j] = 'e';
tab[i][j] = NOM_ENVOI;
}
//Poubelle
if (j>=largeur-(SIZE_MUR+BLOC_COMPT_SIZE) && j<largeur-(SIZE_MUR+BLOC_COMPT_SIZE)+POUBELLE_LARGEUR && i>=hauteur-(SIZE_MUR + POUBELLE_HAUTEUR) && i<hauteur-SIZE_MUR){
tab[i][j] = 't';
tab[i][j] = NOM_POUBELLE;
}
}
}
......
......@@ -37,6 +37,39 @@ struct sprite_s{
typedef struct sprite_s sprite_t;
/**
* @brief Représentation du plat
*/
struct plat_s{
sprite_t ingredient; /*!< sprite d'un ingrédient*/
int cuisson; /*!< Etat de la cuisson*/
};
/**
* \brief Type qui correspond au plat
*/
typedef struct plat_s plat_t;
/**
* \brief Representation du menu et des stocks
*/
struct stock_s{
plat_t stock_tomate[QTE_STOCK]; /*!< tableau des sprites du stock de tomates*/
plat_t stock_pain[QTE_STOCK]; /*!< tableau des sprites du stock de tomates*/
plat_t stock_steak[QTE_STOCK]; /*!< tableau des sprites du stock de tomates*/
plat_t stock_salade[QTE_STOCK]; /*!< tableau des sprites du stock de tomates*/
plat_t stock_fromage[QTE_STOCK]; /*!< tableau des sprites du stock de tomates*/
plat_t stock_cornichon[QTE_STOCK]; /*!< tableau des sprites du stock de tomates*/
int** plats[NB_PLAT][NB_INGREDIENT]; /*!< tableau 2D représentant l'état de préparation des plats*/
int score; /*!< Score actuel*/
};
/**
* \brief Type qui correspond au menu et aux stocks
*/
typedef struct stock_s stock_t;
struct world_s{
int gameover; /*!< Champ indiquant si l'on est à la fin du jeu */
sprite_t joueur; /*!< Sprite du joueur */
......@@ -48,7 +81,7 @@ struct world_s{
sprite_t comptoire[NB_COMPT_1]; /*< Tableau de sprite de comptoir */
sprite_t plat[NB_PLAT]; /*!< Tableau des sprites type de plats */
sprite_t tomates[10] ;
int score; /*!< Score du joueur */
stock_t etat_stocks; /*!< Structure gérant les stocks et la complétion des repas*/
int compteur_plats; /*!< Nombre d'ennemis étant sorti de l'écran */
int attente; /*!< Compte le nombre de tours avant la fin de la partie*/
char** map; /*!< tableau de caractère correspondant à l'état de la map actuel */
......@@ -72,6 +105,28 @@ typedef struct world_s world_t;
*/
void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state);
/**
* @brief Initialise un plat et son sprite
*
* @param plat pointeur vers le sprite d'un ingrédient à initialiser
* @param nom Caractère représentant le plat sur la map
* @param x Localisation sur l'axe des abscisses
* @param y Localisation sur l'axe des ordonnées
* @param w Largeur
* @param h Hauteur
* @param v Vitesse
* @param state Etat du sprite
*/
void init_plat (plat_t* plat, char nom, int x, int y, int w, int h, int v, int state);
/**
* @brief Initialise les stocks et l'état de complétion des burgers
*
* @param stocks Etat des stocks
* @param world Données du monde
*/
void init_stocks(stock_t* stocks, world_t *world);
/**
* @brief Affiche certains éléments d'un sprite
*
......@@ -110,6 +165,39 @@ void build_sprites_tab (sprite_t *sprite, char nomSprite, int largeur, int haute
*/
SDL_Rect get_rect (sprite_t *sprite);
/**
* @brief Retourne un sprite dans une structure plat
*
* @param plat
* @return sprite_t*
*/
sprite_t* get_sprite (plat_t *plat);
/**
* @brief récupère la valeur de la cuisson
*
* @param plat
* @return int état de la cuisson
*/
int get_cuisson (plat_t *plat);
/**
* @brief Modifie la valeur de la cuisson
*
* @param plat
* @param cuisson
*/
void set_cuisson(plat_t *plat, int cuisson);
/**
* @brief Ajoute à la position du sprite les valeurs indiquées
*
* @param sprite
* @param x_move valeur à ajouter sur l'axe des abscisses
* @param y_move valeur à ajouter sur l'axe des ordonnées
*/
void modif_position (sprite_t *sprite, int x_move, int y_move);
/**
* \brief Vérifie si deux sprites sont en collisions
* \param spr1 Sprite
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment