Commit 25ad633c authored by vautrin33u's avatar vautrin33u
Browse files

Ajout logique de limite à tester + erreur de désallocation mémoire

parent 248aa344
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -71,7 +71,7 @@ char** lire_fichier (const char* nomFichier){ //malfonctionne
int colonne = 0;
taille_fichier(nomFichier, &ligne, &colonne);
printf("\n Taille ligne: %d | colonne : %d \n", ligne, colonne);
char** tab = allouer_tab_2D(colonne, ligne);
char** tab = allouer_tab_2D(colonne, ligne);//inversion ligne
for (int i=0; i<ligne; i++){
for (int j=0; j<colonne; j++){
......
......@@ -14,7 +14,7 @@ void clean_textures(textures_t *textures){
void init_textures (SDL_Renderer *renderer, textures_t *textures, TTF_Font *font){
textures->fond = charger_image("Ressources/fond1.bmp", renderer);
//textures->joueur = charger_image ("Ressources/joueur.bmp", renderer);
textures->joueur = charger_image ("Ressources/joueur.bmp", renderer);
// SDL_Color color = { 255, 0, 255 };
//... = charger_texte ("Score : ", renderer, font, color);
}
......@@ -25,7 +25,31 @@ void apply_background (SDL_Renderer *renderer, textures_t *textures){
}
}
void colorier_rect (SDL_Renderer *renderer, SDL_Rect rectangle, SDL_Color couleur){
SDL_SetRenderDrawColor(renderer, couleur.r, couleur.g, couleur.b, couleur.a);
for (int i=0; i<rectangle.y; i++){
for (int j=0; j<rectangle.x; j++){
SDL_RenderDrawPoint(renderer, j, i);
}
}
}
SDL_Rect create_SDL_rect (int x, int y, int w, int h){
//revoir le type, potentiellement faux
SDL_Rect rectangle;
rectangle.x = x;
rectangle.y = y;
rectangle.w = w;
rectangle.h = h;
return rectangle;
}
void update_graphics (SDL_Renderer *renderer, world_t *world, textures_t *textures){
SDL_RenderClear(renderer); // permet de vider le Renderer (ecran) de toutes les textures
apply_background (renderer, textures);
......
......@@ -46,5 +46,34 @@ void init_textures (SDL_Renderer *renderer, textures_t *textures, TTF_Font *font
*/
void apply_background (SDL_Renderer *renderer, textures_t *textures);
/**
* @brief Créer un objet SDL_rect
*
* @param x abscisse
* @param y ordonnée
* @param w largeur
* @param h hauteur
* @return SDL_Rect
*/
SDL_Rect create_SDL_rect (int x, int y, int w, int h);
/**
* @brief Colorie un rectangle d'une couleur donnée
*
* @param renderer surface correspondant à la fenetre
* @param rectangle rectangle
* @param couleur couleur sélectionnée
*/
void colorier_rect (SDL_Renderer *renderer, const SDL_Rect rectangle, const SDL_Color couleur);
/**
* @brief mets à jour les éléments graphique de la fenêtre de jeu
*
* @param renderer
* @param world données de jeu
* @param textures textures disponibles
*/
void update_graphics (SDL_Renderer *renderer, world_t *world, textures_t *textures);
#endif
\ No newline at end of file
......@@ -17,7 +17,11 @@ 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, SCREEN_WIDTH*0.1, SCREEN_HEIGHT*0.1, SIZE_JOUEUR, SIZE_JOUEUR, SIZE_JOUEUR/2);
//init_sprite(&world->joueur, SCREEN_WIDTH*0.1, SCREEN_HEIGHT*0.1, SIZE_JOUEUR, SIZE_JOUEUR, SIZE_JOUEUR/2, 0);
//Charge la carte
world->level = init_map();
world-> map = world->level;
/*
......@@ -30,7 +34,7 @@ void init_data(world_t * world){ //faux
}
void init_sprite(sprite_t *sprite, int x, int y, int w, int h, int v, int state){ //faux
void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state){ //faux
//La fonction initialise tous les composants d'un sprite
sprite->x = x;
sprite->y = y;
......@@ -39,6 +43,7 @@ void init_sprite(sprite_t *sprite, int x, int y, int w, int h, int v, int state)
sprite->v = v;
sprite->etat = state;
sprite->is_visible = 0;
sprite->nom = nom;
}
int aleatoire (int a, int b){
......@@ -86,7 +91,7 @@ int estFini(world_t *world){
return world->gameover;
}
void limites_externes (sprite_t *sprite){
void limites_externes (sprite_t *sprite, world_t *world){
//Défini les limites selon les murs
if (sprite->x > (SCREEN_WIDTH*0.9)){
//mur droite
......@@ -110,6 +115,92 @@ void limites_externes (sprite_t *sprite){
}
void reset_sprite_on_map (sprite_t *sprite, world_t *world){
//On efface la position du joueur sur map
for (int i=0; i<SCREEN_HEIGHT; i++){
for (int j=0; j<SCREEN_WIDTH; j++){
if (world->map[i][j]== sprite->nom){
world->map[i][j] = ' ';
}
}
}
}
void place_sprite_on_map (sprite_t *sprite, world_t *world){
//on écrit la position du joueur sur la map
for (int i=sprite->y; i < sprite->y + sprite->h ; i++){
for (int j = sprite->x ; j < sprite->x + sprite->w ; j++){
world->map[i][j]= sprite->nom;
}
}
}
void deplace_sprite (sprite_t *sprite, world_t *world){
//permet de déplacer le sprite et de corriger les données de map de manière cohérente
reset_sprite_on_map(sprite, world);
int compteur;
switch (return_state(sprite)){
case 0:
//déplace vers le bas
sprite->y += sprite->v;
if (world->map[sprite->y + SIZE_JOUEUR][sprite->x] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x + SIZE_JOUEUR] != ' '){
//Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
for (int y= sprite->y; y<SIZE_JOUEUR; y++){
if (world->map[y][sprite->x] == ' '){
compteur++;
}
}
sprite->x -= compteur;
}
break;
case 1:
//déplace vers le haut
sprite->y -= sprite->v;
if (world->map[sprite->y][sprite->x] != ' ' || world->map[sprite->y][sprite->x + SIZE_JOUEUR] != ' '){
//Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
for (int y= sprite->y; y<SIZE_JOUEUR; y++){
if (world->map[y][sprite->x] != ' '){
compteur++;
}
}
sprite->x += compteur;
}
break;
case 2:
//déplace vers la droite
sprite->x += sprite->v;
if (world->map[sprite->y][sprite->x + SIZE_JOUEUR] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x + SIZE_JOUEUR] != ' '){
//Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
for (int x= sprite->x; x<SIZE_JOUEUR; x++){
if (world->map[sprite->y][x] == ' '){
compteur++;
}
}
sprite->x -= compteur;
}
break;
case 3:
//déplace vers la gauche
sprite->x -= sprite->v;
if (world->map[sprite->y][sprite->x] != ' ' || world->map[sprite->y + SIZE_JOUEUR][sprite->x] != ' '){
//Compter le nombre d'espace avant d'arriver au bloc, et placer le joueur contre le bloc interdit
for (int x= sprite->x; x<SIZE_JOUEUR; x++){
if (world->map[sprite->y][x] != ' '){
compteur++;
}
}
sprite->x += compteur;
}
break;
}
limites_externes(sprite, world);
place_sprite_on_map(sprite, world);
}
void gestion_events(SDL_Event *event, world_t *world){
SDL_PollEvent(event);
......@@ -128,7 +219,7 @@ void gestion_events(SDL_Event *event, world_t *world){
set_bas(&world->joueur);
break;
case SDLK_d:
set_droit(&world->joueur);
set_droite(&world->joueur);
break;
case SDLK_q:
set_gauche(&world->joueur);
......@@ -141,8 +232,8 @@ void gestion_events(SDL_Event *event, world_t *world){
char** init_map (){
const char* nomFichier = "Ressources/map.txt";
int hauteur = SCREEN_HEIGHT/10;
int largeur = SCREEN_WIDTH/10;
int hauteur = SCREEN_HEIGHT;
int largeur = SCREEN_WIDTH;
char** tab = allouer_tab_2D(hauteur, largeur);
for (int i=0; i<hauteur; i++){
for (int j=0; j<largeur; j++){
......@@ -186,15 +277,13 @@ char** init_map (){
genere_fichier(nomFichier, tab, hauteur, largeur);
return tab;
}
/*
void handle_collisions (world_t world, char** map){
const char nomFichier = "Ressouces/save.txt";
void update_data (world_t *world){
const char *nomSave = "Ressouces/save.txt";
genere_fichier(nomFichier, tab, SCREEN_HEIGHT, SCREEN_WIDTH);
return tab;
genere_fichier(nomSave, world->map, SCREEN_HEIGHT, SCREEN_WIDTH);
}
*/
......@@ -21,6 +21,7 @@
* \brief Representation d'un sprite
*/
struct sprite_s{
char nom; /*!< char du sprite utilisé sur map*/
int x; /*!< abscisse du centre du sprite*/
int y; /*!< ordonnée du centre du sprite*/
int h; /*!< hauteur du sprite*/
......@@ -44,6 +45,8 @@ struct world_s{
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*/
char** map; /*!< tableau de caractère correspondant à l'état de la map actuel */
char** level; /*!< tableau de car correspondant à l'architecture du niveau */
};
/**
......@@ -54,6 +57,7 @@ typedef struct world_s world_t;
/**
* \brief La fonction initialise un sprite
* \param sprite pointeur vers le sprite à initialiser
* \param nom charactère représentant le sprite sur la map
* \param x gestion de la localisation sur l'axe des abscisses
* \param y gestion de la localisation sur l'axe des ordonnés
* \param w largeur du sprite
......@@ -61,7 +65,7 @@ typedef struct world_s world_t;
* \param v vitesse verticale du sprite
* \param state état du sprite
*/
void init_sprite(sprite_t *sprite, int x, int y, int w, int h, int v, int state);
void init_sprite(sprite_t *sprite, char nom, int x, int y, int w, int h, int v, int state);
/**
......@@ -108,7 +112,7 @@ char** init_map ();
* @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, char** map);
void handle_collisions (world_t world);
/**
* @brief Indique que le sprite face le bas
......@@ -149,9 +153,18 @@ int return_state (sprite_t *sprite);
/**
* @brief gestions des limites des murs
*
* @param sprite
* @param sprite sprite pour lequel on test les limites
* @param world données du monde
*/
void limites_externes (sprite_t *sprite, world_t *world);
/**
* @brief Déplacement d'un sprite et actualisation de la map
*
* @param sprite sprite qui se déplace
* @param world données du monde
*/
void limites_externes (sprite_t *sprite);
void deplace_sprite (sprite_t *sprite, world_t *world);
#endif
\ No newline at end of file
......@@ -36,6 +36,9 @@ if (windows == NULL) {
return 1;
}
//Chargement de l'état initial du jeu
//init_data(&world);
//Chargement des textures sur le renderer
ecran = SDL_CreateRenderer(windows, -1, SDL_RENDERER_ACCELERATED);
init_textures(ecran, &textures, font);
......@@ -47,6 +50,7 @@ while (estFini(&world)==0){
//Gestion des évenements (entrées joueurs)
gestion_events(&evenements, &world);
//update_graphics(ecran, &world, &textures);
......
......@@ -76,24 +76,21 @@ void test_handle_collision(){
char ** source = init_map();
int n = SCREEN_HEIGHT/10;
int m = SCREEN_WIDTH/10;
desallouer_tab_2D(source, SCREEN_WIDTH/10);
}
void test_lecture_map(){
char ** source;
int n = SCREEN_HEIGHT/10;
int m = SCREEN_WIDTH/10;
source = lire_fichier("Ressources/map.txt");
int n = SCREEN_HEIGHT;
int m = SCREEN_WIDTH;
char ** source = lire_fichier("Ressources/map.txt");
taille_fichier("Ressources/map.txt", &n, &m);
printf("Taille: %d / %d \n", n,m);
afficher_tab_2D(source, n, m);
//desallouer_tab_2D(source, n); //pose pb
//afficher_tab_2D(source, n, m);
desallouer_tab_2D(source, n); //pose pb - plus mtn x)
}
// Zone test
int main()
{
......
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