Commit 0bd61512 authored by vautrin33u's avatar vautrin33u
Browse files

Premiere tentative de mise en place de règles avec ingrédients

parent a0a507c3
This diff is collapsed.
......@@ -9,6 +9,9 @@
#ifndef CONSTANTES_H
#define CONSTANTES_H
//enum état pour décrire la direction du sprite
enum etat {BAS, HAUT, DROITE, GAUCHE, MOBILE, FIXE};
/**
* \brief Largeur de l'écran
*/
......@@ -32,7 +35,7 @@
/**
* \brief Nombre d'ingrédients
* */
#define NB_INGREDIENT 5
#define NB_INGREDIENT 6
/**
* \brief taille joueur
......
......@@ -34,6 +34,9 @@ void clean_textures(textures_t *textures){
if (textures->poubelle != NULL){
SDL_DestroyTexture(textures->poubelle);
}
if (textures->ingredient != NULL){
SDL_DestroyTexture(textures->ingredient);
}
}
void nettoyage_graphisme (SDL_Renderer *renderer, textures_t *textures, SDL_Window *fenetre){
......@@ -43,6 +46,7 @@ void nettoyage_graphisme (SDL_Renderer *renderer, textures_t *textures, SDL_Wind
}
void init_textures (SDL_Renderer *renderer, textures_t *textures, TTF_Font *font){
Uint8 r = 255, g = 255, b = 255;
textures->fond = charger_image("Ressources/fond1.bmp", renderer);
textures->joueur = charger_image ("Ressources/joueur.bmp", renderer);
textures->comptoire = charger_image ("Ressources/compt0.bmp", renderer);
......@@ -51,6 +55,7 @@ void init_textures (SDL_Renderer *renderer, textures_t *textures, TTF_Font *font
textures->four[0] = charger_image ("Ressources/four0.bmp", renderer);
textures->poubelle = charger_image ("Ressources/trash0.bmp", renderer);
textures->lavabo[0] = charger_image ("Ressources/lavabo0.bmp", renderer);
textures->ingredient = charger_image_transparente("Ressources/ingredient.bmp", renderer, r, g, b);
// SDL_Color color = { 255, 0, 255 };
//... = charger_texte ("Score : ", renderer, font, color);
......@@ -87,6 +92,15 @@ void apply_graphics (SDL_Renderer *renderer, textures_t *textures, world_t *worl
}
}
}
SDL_Rect temp;
if (textures->ingredient !=NULL){
for (int i=0; i<NB_INGREDIENT; i++){
if (est_visible(&world->tomates[i])){
temp = create_SDL_rect_from_texture(textures->ingredient, 0, 0, PLAT_SIZE, PLAT_SIZE);
SDL_RenderCopy(renderer, textures->ingredient, &temp, &world->tomates[i].rect);
}
}
}
}
......@@ -98,13 +112,17 @@ void colorier_rect (SDL_Renderer *renderer, SDL_Rect rectangle, SDL_Color couleu
}
}
}
/*
SDL_Rect create_SDL_rect_from_texture (SDL_Texture * texture){
SDL_Rect create_SDL_rect_from_texture (SDL_Texture * texture, int x, int y, int h, int w){
//Permet de créer un SDL_rect retournant la texture de la taille de la texture (SOURCE)
int w;
int h;
SDL_QueryTexture(texture, NULL, NULL, &w, &h);
return create_SDL_rect (0, 0, w, h);
int largeur;
int hauteur;
SDL_QueryTexture(texture, NULL, NULL, &largeur, &hauteur);
if (h>hauteur || w>largeur || h<=0 || w<=0){
SDL_Rect temp = {0,0,0,0};
return temp;
}
return create_SDL_rect (x, y, w, h);
}
SDL_Rect create_SDL_rect (int x, int y, int w, int h){
......@@ -116,7 +134,7 @@ SDL_Rect create_SDL_rect (int x, int y, int w, int h){
rectangle.h = h;
return rectangle;
}
*/
void update_graphics (SDL_Renderer *renderer, world_t *world, textures_t *textures){
......@@ -126,8 +144,6 @@ void update_graphics (SDL_Renderer *renderer, world_t *world, textures_t *textur
}
SDL_Texture* charger_image (const char* nomfichier, SDL_Renderer* renderer){
//Charge une image et retourne la surface de texture associée
SDL_Surface * image = SDL_LoadBMP(nomfichier);
......
......@@ -21,6 +21,7 @@ struct textures_s{
SDL_Texture* lavabo[1] ; /*< Tableau de texture du frigo */
SDL_Texture* poubelle ; /*< Texture de la poubelle */
SDL_Texture* frigo[1] ; /*< Tableau de texture du frigo */
SDL_Texture* ingredient ; /*< textures des ingredients */
//TTF_Font* police; /*Texture de la police d'écriture*/
};
......@@ -92,19 +93,23 @@ void apply_graphics (SDL_Renderer *renderer, textures_t *textures, world_t *worl
SDL_Rect create_SDL_rect (int x, int y, int w, int h);
/**
* @brief Créer un SDL_rect retournant la texture de la taille de la texture (SOURCE)
* @brief Créer un SDL_rect retournant un rectangle de la taille d'un sprite issue d'une image (SOURCE)
*
* @param texture
* @return const SDL_Rect* représentant l'image source tel quel
* @param x position abscisse du rectangle à représenter
* @param y position ordonné du rectangle à représenter
* @param h hauteur du rectangle à représenter
* @param w largeur du rectangle à représenter
* @return SDL_Rect représentant l'image source tel quel
*/
SDL_Rect create_SDL_rect_from_texture (SDL_Texture * texture);
SDL_Rect create_SDL_rect_from_texture (SDL_Texture * texture, int x, int y, int h, int w);
/**
* @brief Créer un SDL_rect selon les données d'un sprite (DEST)
*
* @param sprite
* @return const SDL_Rect*
*/
SDL_Rect create_SDL_rect_from_sprite (sprite_t * sprite);
/**
* @brief Colorie un rectangle d'une couleur donnée
......
......@@ -17,7 +17,7 @@ void init_data(world_t * world){ //faux
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, 0);
init_sprite(&world->joueur, 'J', 200, 200, SIZE_JOUEUR, SIZE_JOUEUR, 10, BAS);
//Charge la carte
world->map = init_map();
......@@ -29,22 +29,34 @@ void init_data(world_t * world){ //faux
build_sprite_unique(&world->envoi, 'e', 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,0);
init_sprite(&world->comptoire[k], '0', 1, 1, 1, 1,0,BAS);
set_invisible(&world->comptoire[k]);
build_sprites_tab(&world->comptoire[k], 'P', BLOC_COMPT_SIZE, BLOC_COMPT_SIZE, &n_sprite, world->map);
print_sprite(&world->comptoire[k]);
}
//build_sprites_tab(&world->comptoire, 'P', BLOC_COMPT_SIZE, BLOC_COMPT_SIZE, NB_COMPT_1, world->map);
/*
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);
*/
SDL_Rect temp;
for (int i=0; i<10; i++){
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]);
}
}
void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state){
//La fonction initialise tous les composants d'un sprite
sprite->rect.x = x;
sprite->rect.y = y;
sprite->rect.w = w;
sprite->rect.h = h;
sprite->v = v;
sprite->etat = state;
sprite->is_visible = 1;
sprite->nom = nom;
}
void print_sprite (sprite_t *sprite){
// Fonction permettant d'afficher les données contenues dans un sprite
printf("nom : %c -- x= %d | y=%d | w= %d | h= %d | v= %d | visible : %d \n", sprite->nom, sprite->rect.x, sprite->rect.y, sprite->rect.w, sprite->rect.h, sprite->v, sprite->is_visible);
}
void build_sprite_unique (sprite_t *sprite, char nom, int largeur, int hauteur, char** map){
......@@ -79,14 +91,13 @@ void build_sprite_unique (sprite_t *sprite, char nom, int largeur, int hauteur,
//Gestion des positions possibles.
if (comptX == largeur && comptY == hauteur){
init_sprite(sprite, nom, x, y+1-hauteur, largeur, hauteur, 0, 0);
init_sprite(sprite, nom, x, y+1-hauteur, largeur, hauteur, 0, BAS);
}
if (comptX == hauteur && comptY == largeur){
init_sprite(sprite, nom, x, y+1-largeur, hauteur, largeur, 0, 0);
init_sprite(sprite, nom, x, y+1-largeur, hauteur, largeur, 0, BAS);
}
//print_sprite(sprite);
}
//TODO: nécessaire pour trouver tous les blocs de comptoires, trouver une solution.
void build_sprites_tab (sprite_t *sprite, char nomSprite, int largeur, int hauteur, int* compt, char** map){
// On recherche les instances existantes et on y met les bonnes valeurs
......@@ -101,7 +112,7 @@ void build_sprites_tab (sprite_t *sprite, char nomSprite, int largeur, int haute
}
//Créer un sprite
if (nb_sprite == *compt && map[i][j] == nomSprite){
init_sprite(sprite, nomSprite, j, i, largeur, hauteur, 0, 0);
init_sprite(sprite, nomSprite, j, i, largeur, hauteur, 0, BAS);
map[i][j] = tolower(copy); //On efface les marqueurs de sprites, plus nécessaires
break; // On quitte
}
......@@ -109,6 +120,10 @@ void build_sprites_tab (sprite_t *sprite, char nomSprite, int largeur, int haute
}
}
SDL_Rect get_rect (sprite_t *sprite){
return sprite->rect;
}
int has_collided (sprite_t* spr1, sprite_t* spr2){
return SDL_HasIntersection(&spr1->rect, &spr2->rect);
}
......@@ -119,22 +134,22 @@ void handle_collision (sprite_t* spr_move, sprite_t* spr_fixed){
SDL_bool collision = SDL_IntersectRect(&spr_move->rect, &spr_fixed->rect, &temp);
if (collision == SDL_TRUE && est_visible(spr_move) && est_visible(spr_fixed)){
switch (return_state(spr_move)){
case 0:
case BAS:
//cas dans lequel le joueur descend 'à travers' un meuble
spr_move->rect.y -= temp.h;
break;
case 1:
case HAUT:
//cas dans lequel le joueur va 'à travers' un meuble vers le haut
spr_move->rect.y += temp.h;
break;
case 2:
case DROITE:
//cas dans lequel le joueur va 'à travers' un meuble vers la droite
spr_move->rect.x -= temp.w;
break;
case 3:
case GAUCHE:
//cas dans lequel le joueur va 'à travers' un meuble vers la gauche
spr_move->rect.x += temp.w;
break;
......@@ -144,35 +159,6 @@ void handle_collision (sprite_t* spr_move, sprite_t* spr_fixed){
}
}
void limites_interne (world_t* world){
//Gestion des limites internes au jeu
handle_collision(&world->joueur, &world->envoi);
handle_collision(&world->joueur, &world->four);
handle_collision(&world->joueur, &world->frigo);
handle_collision(&world->joueur, &world->lavabo);
handle_collision(&world->joueur, &world->poubelle);
for (int i=0; i<NB_COMPT_1; i++){
handle_collision(&world->joueur, &world->comptoire[i]);
}
}
void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state){
//La fonction initialise tous les composants d'un sprite
sprite->rect.x = x;
sprite->rect.y = y;
sprite->rect.w = w;
sprite->rect.h = h;
sprite->v = v;
sprite->etat = state;
sprite->is_visible = 1;
sprite->nom = nom;
}
void print_sprite (sprite_t *sprite){
// Fonction permettant d'afficher les données contenues dans un sprite
printf("nom : %c -- x= %d | y=%d | w= %d | h= %d | v= %d | visible : %d \n", sprite->nom, sprite->rect.x, sprite->rect.y, sprite->rect.w, sprite->rect.h, sprite->v, sprite->is_visible);
}
int aleatoire (int a, int b){
// Fonction générant une valeur aléatoire entre a (inclu) et b (exclu)
......@@ -181,22 +167,22 @@ int aleatoire (int a, int b){
void set_bas (sprite_t *sprite){
// Sprite va vers le bas
sprite->etat = 0;
sprite->etat = BAS;
}
void set_haut (sprite_t *sprite){
// Sprite va vers le haut
sprite->etat = 1;
sprite->etat = HAUT;
}
void set_droite (sprite_t *sprite){
// Sprite va vers la droite
sprite->etat = 2;
sprite->etat = DROITE;
}
void set_gauche (sprite_t *sprite){
// Sprite va vers la gauche
sprite->etat = 3;
sprite->etat = GAUCHE;
}
int return_state (sprite_t *sprite){
......@@ -245,7 +231,19 @@ void limites_externes (sprite_t *sprite){
//mur haut
sprite->rect.y = SIZE_MUR;
}
}
void limites_interne (world_t* world){
//Gestion des limites internes au jeu
handle_collision(&world->joueur, &world->envoi);
handle_collision(&world->joueur, &world->four);
handle_collision(&world->joueur, &world->frigo);
handle_collision(&world->joueur, &world->lavabo);
handle_collision(&world->joueur, &world->poubelle);
for (int i=0; i<NB_COMPT_1; i++){
handle_collision(&world->joueur, &world->comptoire[i]);
}
}
void reset_sprite_on_map (sprite_t *sprite, world_t *world){
......
......@@ -47,6 +47,7 @@ struct world_s{
sprite_t poubelle; /*< Sprite de la poubelle */
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 */
int compteur_plats; /*!< Nombre d'ennemis étant sorti de l'écran */
int attente; /*!< Compte le nombre de tours avant la fin de la partie*/
......@@ -101,6 +102,13 @@ void build_sprite_unique (sprite_t *sprite, char nom, int largeur, int hauteur,
*/
void build_sprites_tab (sprite_t *sprite, char nomSprite, int largeur, int hauteur, int* compt, char** map);
/**
* @brief retourne le SDL_Rect d'un sprite
*
* @param sprite
* @return SDL_Rect
*/
SDL_Rect get_rect (sprite_t *sprite);
/**
* \brief Vérifie si deux sprites sont en collisions
......
......@@ -46,7 +46,7 @@ init_textures(ecran, &textures, font);
while (estFini(&world)==0){
SDL_RenderClear(ecran); // permet de vider le Renderer (ecran) de toutes les textures
//Gestion des évenements (entrées joueurs)
//Gestion des évenements (entrées joueurs) suivi de la mise à jour des données (collisions etc) et actualisation graphique
gestion_events(&evenements, &world);
update_data(&world);
update_graphics(ecran, &world, &textures);
......
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