Commit 1500d051 authored by vautrin33u's avatar vautrin33u
Browse files

Gestion collision joueur/meubles faite (visibilité inclue)

parent 862eb898
This diff is collapsed.
......@@ -73,10 +73,10 @@ void apply_background (SDL_Renderer *renderer, textures_t *textures);
* @brief Applique une texture sur un sprite
*
* @param renderer surface écran de jeu
* @param image SDL_Texture du sprite
* @param tex SDL_Texture du sprite
* @param sprite données du sprite
*/
void apply_sprite (SDL_Renderer *renderer, SDL_Texture * image, sprite_t *sprite);
void apply_sprite (SDL_Renderer *renderer, SDL_Texture *tex, sprite_t sprite);
/**
* @brief Applique tous les éléments graphiques sur le renderer
......
......@@ -77,7 +77,7 @@ void build_sprite_unique (sprite_t *sprite, char nom, int largeur, int hauteur,
if (comptX == hauteur && comptY == largeur){
init_sprite(sprite, nom, x, y+1-largeur, hauteur, largeur, 0, 0);
}
print_sprite(sprite);
//print_sprite(sprite);
}
//TODO: nécessaire pour trouver tous les blocs de comptoires, trouver une solution.
/*
......@@ -90,8 +90,53 @@ void build_sprites_tab (world_t* world, char nomSprite, int largeur, int hauteur
}
}*/
void limites_internes (world_t world, sprite_t spr1, sprite_t spr2){
int has_collided (sprite_t* spr1, sprite_t* spr2){
return SDL_HasIntersection(&spr1->rect, &spr2->rect);
}
void handle_collision (sprite_t* spr_move, sprite_t* spr_fixed){
//Gestion de rencontre entre deux sprites
SDL_Rect temp = {0,0,0,0};
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:
//cas dans lequel le joueur descend 'à travers' un meuble
spr_move->rect.y -= temp.h;
break;
case 1:
//cas dans lequel le joueur va 'à travers' un meuble vers le haut
spr_move->rect.y += temp.h;
break;
case 2:
//cas dans lequel le joueur va 'à travers' un meuble vers la droite
spr_move->rect.x -= temp.w;
break;
case 3:
//cas dans lequel le joueur va 'à travers' un meuble vers la gauche
spr_move->rect.x += temp.w;
break;
}
//printf("x = %d, y= %d, h = %d, w= %d \n", temp.x, temp.y, temp.h, temp.w);
//printf("state : %d \n", return_state(spr_move));
}
}
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){
......@@ -102,7 +147,7 @@ void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v,
sprite->rect.h = h;
sprite->v = v;
sprite->etat = state;
sprite->is_visible = 0;
sprite->is_visible = 1;
sprite->nom = nom;
}
......@@ -151,6 +196,11 @@ void set_invisible (sprite_t *sprite){
sprite->is_visible=1;
}
int est_visible (sprite_t *sprite){
// Retourne l'état de visibilité d'un sprite
return sprite->is_visible;
}
int estFini(world_t *world){
//Défini si le jeu est terminé
return world->gameover;
......@@ -212,22 +262,30 @@ void gestion_events(SDL_Event *event, world_t *world){
world->gameover = 1; break;
//Déplacement du joueur
case SDLK_UP:
set_haut(&world->joueur);
world->joueur.rect.y -= world->joueur.v;
//deplace_haut(&world->joueur, world);
break;
case SDLK_DOWN:
set_bas(&world->joueur);
world->joueur.rect.y += world->joueur.v;
//deplace_bas(&world->joueur, world);
break;
case SDLK_RIGHT:
set_droite(&world->joueur);
world->joueur.rect.x += world->joueur.v;
//deplace_droite(&world->joueur, world);
break;
case SDLK_LEFT:
set_gauche(&world->joueur);
world->joueur.rect.x -= world->joueur.v;
//deplace_gauche(&world->joueur, world);
break;
//case SDLK_SPACE:
......@@ -289,6 +347,7 @@ void update_data (world_t *world){
const char *nomSave = "Ressources/save.txt";
limites_externes(&world->joueur);
limites_interne(world);
place_sprite_on_map(&world->joueur, world);
//printf("Sprite joueur : x : %d | y: %d \n", world->joueur.x, world->joueur.y);
genere_fichier(nomSave, world->map, SCREEN_HEIGHT, SCREEN_WIDTH);
......
......@@ -27,7 +27,7 @@ struct sprite_s{
char nom; /*!< char du sprite utilisé sur map*/
int v; /*!< vitesse du sprite*/
int etat; /*!< état du sprite; permet de varier son apparence */
int is_visible; /*!< Gère la visibilité d'un sprite; 0 si visible, i sinon */
int is_visible; /*!< Gère la visibilité d'un sprite; 1 si visible, 0 sinon */
SDL_Rect rect; /*!< structure de position du sprite*/
};
......@@ -100,6 +100,30 @@ void build_sprite_unique (sprite_t *sprite, char nom, int largeur, int hauteur,
*/
void build_sprites_tab (world_t* world, char nomSprite, int largeur, int hauteur, int nb_sprites);
/**
* \brief Vérifie si deux sprites sont en collisions
* \param spr1 Sprite
* \param spr2 Sprite
* \param int 0 si faux, 1 si vrai
*/
int has_collided (sprite_t* spr1, sprite_t* spr2);
/**
* \brief Vérifie si deux sprites sont en collisions
* \param spr_move Sprite
* \param spr_fixed Sprite
*/
void handle_collision (sprite_t* spr_move, sprite_t* spr_fixed);
/**
* \brief Gère les collisions du jeu
* \param world Données du monde
*/
void limites_internes (world_t* world);
/**
* \brief la fonction permet de rendre visible un sprite
* \param sprite Les données d'un sprite
......@@ -112,6 +136,14 @@ void set_visible (sprite_t *sprite);
*/
void set_invisible (sprite_t *sprite);
/**
* @brief Sprite visible ou non
*
* @param sprite
* @return int : 1 = visible, 0 = false
*/
int est_visible (sprite_t *sprite);
/**
* \brief La fonction initialise les données du monde du jeu
* \param world les données du monde
......@@ -139,12 +171,6 @@ void gestion_events(SDL_Event *event, world_t *world);
*/
char** init_map ();
/**
* @brief gestions des collisions
* @param world données contenant les positions modifiés
* @param map tab de char représentant l'état du jeu avant la prise en compte des déplacements
*/
void handle_collisions (world_t world);
/**
* @brief Indique que le sprite face le bas
......
File deleted
File deleted
File deleted
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