Commit fddecdad authored by vautrin33u's avatar vautrin33u
Browse files

Améliorations (pas finis) sur les interactions entre sprites

parent f4393060
......@@ -5,8 +5,8 @@ LDFLAGS = `sdl2-config --cflags --libs` -lSDL2_ttf
INCLUDES = -I./SDL2_ttf
EXEC1 = main
EXEC2 = tests
SRC = logique.c gestion_fichiers.c sprite.c graphisme.c main.c
SRC2 = logique.c gestion_fichiers.c sprite.c graphisme.c tests.c
SRC = logique.c gestion_fichiers.c sprite.c stocks.c graphisme.c main.c
SRC2 = logique.c gestion_fichiers.c sprite.c stocks.c graphisme.c tests.c
OBJ = $(SRC:.c=.o)
OBJ2 = $(SRC2:.c=.o)
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -178,7 +178,7 @@ void apply_texte (SDL_Renderer* renderer, world_t* world, textures_t* textures){
message = charger_texte("Score : ", renderer, textures->police, color);
char score_j[10];
sprintf(score_j, " %d", world->score); //Nécessaire pour afficher le score -- limite le nombre de points max!
printf("\n SCORE : %d", get_score(world));
//printf("\n SCORE : %d", get_score(world));
points = charger_texte(score_j, renderer, textures->police, color);
render_texte(renderer, zone_message, message);
render_texte(renderer, zone_score, points);
......
......@@ -287,97 +287,215 @@ void gestion_events(SDL_Event *event, world_t *world){
case SDLK_SPACE:
//Récupération des ingrédients du frigo
for (int i=0; i<INGREDIENT_DISPO; i++){
sprite_t* ingredient = &world->en_cuisine[i];
sprite_t* joueur = &world->joueur;
//Interaction avec le frigo (récupérer les éléments un par un)
if (has_interaction (joueur, &world->frigo) && has_collided(&world->frigo, ingredient) && return_state(ingredient) == POSE){
set_portable(ingredient);
set_visible(ingredient);
init_cuisson(ingredient);
handle_deplacement_ingredient(joueur, ingredient);
break;
}
//Interaction avec le four
if (has_interaction(joueur, &world->four) && has_collided(joueur, ingredient) && return_state(ingredient) == POSE && get_cuisson(ingredient) == CUIT){
/*
if (has_interaction(joueur, &world->four) && has_collided(joueur, ingredient) && return_state(ingredient) == POSE && get_cuisson(ingredient) == CUIT && is_already_carrying(world->en_cuisine)==SDL_FALSE){
//On retire un ingrédient du feu
set_portable(ingredient);
handle_deplacement_ingredient(joueur, ingredient);
break;
}
if (has_interaction(joueur, &world->four) && has_collided(joueur, ingredient) && return_state(ingredient) == PORTE && get_cuisson(ingredient) == CRU){
//On pose un ingrédient pour le cuire
set_posee(ingredient);
set_cuisson(ingredient, CUIT);
break;
}
*/
//Interaction avec le lavabo
if (has_interaction(joueur, &world->lavabo) && has_collided(joueur, ingredient) && return_state(ingredient) == POSE && get_cuisson(ingredient) == PROPRE){
/*
if (has_interaction(joueur, &world->lavabo) && has_collided(joueur, ingredient) && return_state(ingredient) == POSE && get_cuisson(ingredient) == PROPRE && is_already_carrying(world->en_cuisine)==SDL_FALSE){
//On retire un ingrédient du lavabo
set_portable(ingredient);
handle_deplacement_ingredient(joueur, ingredient);
break;
}
if (has_interaction(joueur, &world->lavabo) && has_collided(joueur, ingredient) && return_state(ingredient) == PORTE && get_cuisson(ingredient) == SALE){
//On pose un ingrédient pour le laver
set_posee(ingredient);
set_cuisson(ingredient, PROPRE);
break;
*/
if (has_interaction (joueur, &world->frigo)){
interaction_frigo(world->en_cuisine, joueur, &world->frigo);
}
//Interaction avec la poubelle
if (has_interaction(joueur, &world->poubelle) && has_collided(joueur, ingredient) && return_state(ingredient) == PORTE){
//On pose un ingrédient pour le jeter et le replacer dans le frigo
SDL_Rect temp = get_rect(&world->frigo);
char copy = ingredient->nom;
init_ingre(ingredient, copy, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, POSE);
break;
if (has_interaction(joueur, &world->four)){
interaction_poser_four(world->en_cuisine, joueur, &world->four);
}
if (has_interaction(joueur, &world->poubelle)){
interaction_poubelle(world->en_cuisine, joueur, get_rect(&world->frigo));
}
if (has_interaction(joueur, &world->lavabo)){
interaction_poser_lavabo (world->en_cuisine, joueur, &world->lavabo);
}
if (has_interaction(joueur, &world->envoi)){
interaction_zone_envoi(world, world->en_cuisine, joueur, &world->envoi);
}
//Interaction avec les comptoirs
for (int i=0; i<NB_COMPT_1; i++){
if (has_interaction(joueur, &world->comptoire[i]) && has_collided(joueur, ingredient) && return_state(ingredient) == POSE){
//On retire un ingrédient
if (has_interaction(joueur, &world->comptoire[i]) && has_collided(joueur, ingredient) && return_state(ingredient) == POSE && is_already_carrying(world->en_cuisine)==SDL_FALSE){
//On retire un ingrédient
set_portable(ingredient);
handle_deplacement_ingredient(joueur, ingredient);
break;
}
if (has_interaction(joueur, &world->comptoire[i]) && has_collided(joueur, ingredient) && return_state(ingredient) == PORTE){
//On pose un ingrédient
set_posee(ingredient);
poser_ingredient(joueur, &world->comptoire[i], ingredient);
break;
}
}
//Interaction avec la zone d'envoi et génération du score
if (has_interaction(joueur, &world->envoi) && has_collided(joueur, ingredient) && return_state(ingredient) == PORTE){
//On pose un ingrédient sur la zone d'envoi, calcul du score ET on réinitialise
if (burger_est_complet(world->en_cuisine)){
//On pose le burger entièrement et on calcul le score
for (int i=0; i<INGREDIENT_DISPO; i++){
set_posee(&world->en_cuisine[i]);
calcul_score(world, &world->en_cuisine[i]);
//Réinitialisation du sprite
SDL_Rect temp = get_rect(&world->frigo);
char copy = world->en_cuisine[i].nom;
init_ingre(&world->en_cuisine[i], copy, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, POSE);
}
}
break;
}
}
break;
}
}
}
void interaction_frigo (sprite_t* ingredients, sprite_t* joueur, sprite_t* frigo){
for (int i=0; i<INGREDIENT_DISPO; i++){
//Interaction avec le frigo (récupérer les éléments un par un)
if (has_collided(frigo, &ingredients[i]) && return_state(&ingredients[i]) == POSE && is_already_carrying(ingredients)==SDL_FALSE){
set_portable(&ingredients[i]);
set_visible(&ingredients[i]);
init_cuisson(&ingredients[i]);
handle_deplacement_ingredient(joueur, &ingredients[i]);
break;
}
}
}
void interaction_zone_envoi (world_t* world, sprite_t* ingredients, sprite_t* joueur, sprite_t* envoi){
for (int i=0; i<INGREDIENT_DISPO; i++){
if (has_interaction(joueur, envoi) && has_collided(joueur, &ingredients[i]) && return_state(&ingredients[i]) == PORTE){
//On pose un ingrédient sur la zone d'envoi, calcul du score ET on réinitialise
if (burger_est_complet(ingredients)){
//On pose le burger entièrement et on calcul le score
for (int i=0; i<INGREDIENT_DISPO; i++){
set_posee(&world->en_cuisine[i]);
calcul_score(world, &ingredients[i]);
//Réinitialisation du sprite
SDL_Rect temp = get_rect(&world->frigo);
char copy = ingredients[i].nom;
init_ingre(&ingredients[i], copy, temp.x, temp.y, PLAT_SIZE, PLAT_SIZE, 0, POSE);
}
}
break;
}
}
}
void interaction_poser_four(sprite_t* ingredients, sprite_t* joueur, sprite_t* four){
for (int i=0; i<INGREDIENT_DISPO; i++){
if (has_collided(joueur, &ingredients[i]) && return_state(&ingredients[i]) == PORTE && get_cuisson(&ingredients[i]) == CRU){
//On pose un ingrédient pour le cuire
poser_ingredient(joueur, four, &ingredients[i]);
set_cuisson(&ingredients[i], CUIT);
break;
}
}
}
void interaction_reprendre_four(sprite_t* ingredients, sprite_t* joueur, sprite_t* four){
for (int i=0; i<INGREDIENT_DISPO; i++){
if (has_interaction(joueur, four) && has_collided(joueur, &ingredients[i]) && return_state(&ingredients[i]) == POSE && get_cuisson(&ingredients[i]) == CUIT && is_already_carrying(ingredients)==SDL_FALSE){
set_portable(&ingredients[i]);
handle_deplacement_ingredient(joueur, &ingredients[i]);
break;
}
}
}
void interaction_poser_lavabo (sprite_t* ingredients, sprite_t* joueur, sprite_t* lavabo){
//Interaction avec le lavabo
for (int i=0; i<INGREDIENT_DISPO; i++){
if (has_collided(joueur, &ingredients[i]) && return_state(&ingredients[i]) == PORTE && get_cuisson(&ingredients[i]) == SALE){
//On pose un ingrédient pour le laver
poser_ingredient(joueur, lavabo, &ingredients[i]);
set_cuisson(&ingredients[i], PROPRE);
break;
}
}
}
void interaction_reprendre_lavabo (sprite_t* ingredients, sprite_t* joueur, sprite_t* lavabo){
for (int i=0; i<INGREDIENT_DISPO; i++){
if (has_interaction(joueur, &ingredients[i]) && return_state(&ingredients[i]) == POSE && get_cuisson(&ingredients[i]) == PROPRE && is_already_carrying(ingredients)==SDL_FALSE){
//On retire un ingrédient du lavabo
set_portable(&ingredients[i]);
handle_deplacement_ingredient(joueur, &ingredients[i]);
break;
}
}
}
void interaction_poubelle (sprite_t* ingredients, sprite_t* joueur, SDL_Rect zone_reset){
for (int i=0; i<INGREDIENT_DISPO; i++){
if (has_collided(joueur, &ingredients[i]) && return_state(&ingredients[i]) == PORTE && is_already_carrying(ingredients)==SDL_TRUE){
//On pose un ingrédient pour le jeter et le replacer dans le frigo
char copy = ingredients[i].nom;
init_ingre(&ingredients[i], copy, zone_reset.x, zone_reset.y, PLAT_SIZE, PLAT_SIZE, 0, POSE);
break;
}
}
}
void poser_ingredient (sprite_t* joueur, sprite_t* meuble, sprite_t* ingredient){
//Pose l'ingrédient sur un meuble
switch (return_state(joueur))
{
case HAUT:
ingredient->rect.y = meuble->rect.y + meuble->rect.h - ingredient->rect.h;
//Gestion des positions horizontales de l'ingrédient pour qu'il reste sur le meuble
if (ingredient->rect.x < meuble->rect.x) {
ingredient->rect.x = meuble->rect.x;
}else if (ingredient->rect.x + ingredient->rect.w > meuble->rect.x + meuble->rect.w){
ingredient->rect.x = meuble->rect.x + meuble->rect.w - ingredient->rect.w;
}
break;
case BAS:
ingredient->rect.y = meuble->rect.y;
//Gestion des positions horizontales de l'ingrédient pour qu'il reste sur le meuble
if (ingredient->rect.x < meuble->rect.x) {
ingredient->rect.x = meuble->rect.x;
}else if (ingredient->rect.x + ingredient->rect.w > meuble->rect.x + meuble->rect.w){
ingredient->rect.x = meuble->rect.x + meuble->rect.w - ingredient->rect.w;
}
break;
case GAUCHE:
ingredient->rect.x = meuble->rect.x + meuble->rect.w - ingredient->rect.w;
//Gestion des positions verticales de l'ingrédient pour qu'il reste sur le meuble
if (ingredient->rect.y < meuble->rect.y) {
ingredient->rect.y = meuble->rect.y;
}else if (ingredient->rect.y + ingredient->rect.h > meuble->rect.y + meuble->rect.h){
ingredient->rect.y = meuble->rect.y + meuble->rect.h - ingredient->rect.h;
}
break;
case DROITE:
ingredient->rect.x = meuble->rect.x;
//Gestion des positions verticales de l'ingrédient pour qu'il reste sur le meuble
if (ingredient->rect.y < meuble->rect.y) {
ingredient->rect.y = meuble->rect.y;
}else if (ingredient->rect.y + ingredient->rect.h > meuble->rect.y + meuble->rect.h){
ingredient->rect.y = meuble->rect.y + meuble->rect.h - ingredient->rect.h;
}
break;
default:
break;
}
set_posee(ingredient);
}
SDL_bool is_already_carrying (sprite_t* ingredients){
for (int i=0; i<INGREDIENT_DISPO; i++){
if (return_state(&ingredients[i]) == PORTE){
return SDL_TRUE;
}
}
return SDL_FALSE;
}
SDL_bool burger_est_complet (sprite_t* ingredients){
int compt=0;
......
......@@ -74,6 +74,87 @@ void init_stocks(stock_t* stocks, sprite_t* zone_stockage);
*/
int aleatoire (int a, int b);
/**
* @brief Interaction avec la poubelle
*
* @param ingredients Tous les ingrédients disponibles sur le jeu
* @param joueur
* @param zone_reset SDL_Rect correspondant à la zone de départ des ingrédients
*/
void interaction_poubelle (sprite_t* ingredients, sprite_t* joueur, SDL_Rect zone_reset);
/**
* @brief Poser un objet sur le lavabo
*
* @param ingredients Tous les ingrédients disponibles sur le jeu
* @param joueur
* @param lavabo
*/
void interaction_poser_lavabo (sprite_t* ingredients, sprite_t* joueur, sprite_t* lavabo);
/**
* @brief Reprendre un ingrédient du lavabo
*
* @param ingredients Tous les ingrédients dispo sur le jeu
* @param joueur
* @param lavabo
*/
void interaction_reprendre_lavabo (sprite_t* ingredients, sprite_t* joueur, sprite_t* lavabo);
/**
* @brief Reprendre les ingrédients du four
*
* @param ingredients
* @param joueur
* @param four
*/
void interaction_reprendre_four(sprite_t* ingredients, sprite_t* joueur, sprite_t* four);
/**
* @brief Poser dans le four un ingrédient
*
* @param ingredients
* @param joueur
* @param four
*/
void interaction_poser_four(sprite_t* ingredients, sprite_t* joueur, sprite_t* four);
/**
* @brief Envoie le plat, génère le score et reset les ingrédients
*
* @param world
* @param ingredients
* @param joueur
* @param envoi Zone d'envoi
*/
void interaction_zone_envoi (world_t* world, sprite_t* ingredients, sprite_t* joueur, sprite_t* envoi);
/**
* @brief Génère les ingrédients
*
* @param ingredients
* @param joueur
* @param frigo
*/
void interaction_frigo (sprite_t* ingredients, sprite_t* joueur, sprite_t* frigo);
/**
* @brief Pose un ingrédient sur un meuble
*
* @param joueur
* @param meuble
* @param ingredient
*/
void poser_ingredient (sprite_t* joueur, sprite_t* meuble, sprite_t* ingredient);
/**
* @brief Vérifie si un ingrédient et déjà porté ou non
*
* @param ingredients
* @return SDL_bool
*/
SDL_bool is_already_carrying (sprite_t* ingredients);
/**
* @brief Vérifie que le burger est complet (selon sa position)
*
......
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