Skip to content
Snippets Groups Projects
Commit fddecdad authored by vautrin33u's avatar vautrin33u
Browse files

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

parent f4393060
Branches
No related tags found
No related merge requests found
......@@ -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)
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
......@@ -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)
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment