/* src/menu_view.c * Implémentation complète de l'interface de configuration (Menu) * Utilise la bibliothèque graphique IUT (graph.h). */ #include "menu_view.h" #include #include /* Pour sprintf */ #include /* Pour les calculs simples */ /* --- DÉCLARATIONS (CONSTANTES ET VARIABLES GLOBALES IUT) --- */ /* Constantes de positionnement */ #define IMG_PREVIEW_SIZE 150 #define IMG_START_X 50 #define IMG_START_Y 150 #define IMG_SPACING 200 #define BUTTON_SIZE 30 #define DIM_START_Y 350 /* Variables globales de la bibliothèque IUT pour la souris */ extern int _X; extern int _Y; /* --- PROTOTYPES DES UTILITAIRES PRIVÉS (OBLIGATOIRE EN C89) --- */ static int is_in_rect(int x_click, int y_click, int rx, int ry, int rw, int rh); static void draw_button(int x, int y, const char *text, couleur C_BG); static void draw_text_centered(int x, int y, int w, int h, const char *text, int size); /* --- IMPLÉMENTATION DES FONCTIONS PUBLIQUES (.h) --- */ /* Initialise l'état du menu */ void menu_init(menu_state_t *state) { state->selected_image = 0; /* Image 1 sélectionnée par défaut */ state->rows = MIN_DIMENSION; state->cols = MIN_DIMENSION; state->ready_to_play = 0; } /* Dessine l'écran de configuration du menu */ void menu_render(const menu_state_t *state) { int i; couleur C_FOND = CouleurParNom("white"); couleur C_SELECTION = CouleurParNom("red"); couleur C_TEXTE = CouleurParNom("black"); couleur C_BOUTON = CouleurParNom("dark gray"); couleur C_START = CouleurParNom("green"); char buffer[50]; EffacerEcran(C_FOND); ChoisirCouleurDessin(C_TEXTE); /* 1. Titre et Section Image */ EcrireTexte(IMG_START_X, 50, "CONFIGURATION DU JEU TAQUIN", 2); EcrireTexte(IMG_START_X, 100, "1. Choisir l'image :", 1); /* BOUCLE : Affichage des 3 aperçus d'images */ for (i = 0; i < NUM_IMAGES; i++) { int x = IMG_START_X + i * IMG_SPACING; int y = IMG_START_Y; char path[30]; sprintf(path, "assets/image%d.png", i + 1); /* Affiche l'image */ ChargerImage(path, x, y, 0, 0, IMG_PREVIEW_SIZE, IMG_PREVIEW_SIZE); /* Encadrement si sélectionné */ if (state->selected_image == i) { ChoisirCouleurDessin(C_SELECTION); DessinerRectangle(x - 5, y - 5, IMG_PREVIEW_SIZE + 10, IMG_PREVIEW_SIZE + 10); } } ChoisirCouleurDessin(C_TEXTE); /* 2. Section Dimensions */ int dim_section_x = IMG_START_X; int button_l_offset = 180; int button_c_offset = 400; EcrireTexte(dim_section_x, DIM_START_Y, "2. Choisir les dimensions (3x3 a 8x8) :", 1); /* Affichage de la taille LIGNES */ EcrireTexte(dim_section_x, DIM_START_Y + 40, "Lignes :", 0); sprintf(buffer, "%d", state->rows); EcrireTexte(dim_section_x + 100, DIM_START_Y + 40, buffer, 0); /* Affichage de la taille COLONNES */ EcrireTexte(dim_section_x + 250, DIM_START_Y + 40, "Colonnes :", 0); sprintf(buffer, "%d", state->cols); EcrireTexte(dim_section_x + 350, DIM_START_Y + 40, buffer, 0); /* Boutons de contrôle LIGNES */ draw_button(dim_section_x + button_l_offset, DIM_START_Y + 30, "+", C_BOUTON); draw_button(dim_section_x + button_l_offset + 40, DIM_START_Y + 30, "-", C_BOUTON); /* Boutons de contrôle COLONNES */ draw_button(dim_section_x + button_c_offset, DIM_START_Y + 30, "+", C_BOUTON); draw_button(dim_section_x + button_c_offset + 40, DIM_START_Y + 30, "-", C_BOUTON); /* 3. Bouton DÉMARRER LA PARTIE */ ChoisirCouleurDessin(C_START); RemplirRectangle(300, 500, 200, 50); ChoisirCouleurDessin(CouleurParNom("white")); draw_text_centered(300, 500, 200, 50, "DEMARRER", 2); } /* Gère l'interaction après un clic de souris */ void menu_handle_mouse_click(menu_state_t *state) { int i; int x_click = _X; int y_click = _Y; int btn_size = BUTTON_SIZE; int dim_section_x = IMG_START_X; int button_l_offset = 180; int button_c_offset = 400; /* 1. Clic sur les images */ for (i = 0; i < NUM_IMAGES; i++) { int x_img = IMG_START_X + i * IMG_SPACING; int y_img = IMG_START_Y; if (is_in_rect(x_click, y_click, x_img, y_img, IMG_PREVIEW_SIZE, IMG_PREVIEW_SIZE)) { state->selected_image = i; return; } } /* 2. Clic sur les boutons de Lignes (+/-) */ /* + Lignes */ if (is_in_rect(x_click, y_click, dim_section_x + button_l_offset, DIM_START_Y + 30, btn_size, btn_size)) { if (state->rows < MAX_DIMENSION) state->rows++; return; } /* - Lignes */ if (is_in_rect(x_click, y_click, dim_section_x + button_l_offset + 40, DIM_START_Y + 30, btn_size, btn_size)) { if (state->rows > MIN_DIMENSION) state->rows--; return; } /* 3. Clic sur les boutons de Colonnes (+/-) */ /* + Colonnes */ if (is_in_rect(x_click, y_click, dim_section_x + button_c_offset, DIM_START_Y + 30, btn_size, btn_size)) { if (state->cols < MAX_DIMENSION) state->cols++; return; } /* - Colonnes */ if (is_in_rect(x_click, y_click, dim_section_x + button_c_offset + 40, DIM_START_Y + 30, btn_size, btn_size)) { if (state->cols > MIN_DIMENSION) state->cols--; return; } /* 4. Clic sur DÉMARRER */ if (is_in_rect(x_click, y_click, 300, 500, 200, 50)) { state->ready_to_play = 1; return; } } /* Gère l'interaction clavier */ void menu_handle_key(menu_state_t *state) { if (ToucheEnAttente()) { int key = Touche(); if (key == XK_Escape) { state->ready_to_play = -1; } else if (key == XK_Up) { if (state->rows < MAX_DIMENSION) state->rows++; } else if (key == XK_Down) { if (state->rows > MIN_DIMENSION) state->rows--; } else if (key == XK_Right) { if (state->cols < MAX_DIMENSION) state->cols++; } else if (key == XK_Left) { if (state->cols > MIN_DIMENSION) state->cols--; } else if (key == XK_Return) { state->ready_to_play = 1; } } } /* --- IMPLÉMENTATION DES UTILITAIRES PRIVÉS --- */ /* Vérifie si (x_click, y_click) est dans le rectangle */ static int is_in_rect(int x_click, int y_click, int rx, int ry, int rw, int rh) { return (x_click >= rx && x_click <= rx + rw && y_click >= ry && y_click <= ry + rh); } /* Dessine un bouton rectangulaire rempli avec du texte centré */ static void draw_button(int x, int y, const char *text, couleur C_BG) { ChoisirCouleurDessin(C_BG); RemplirRectangle(x, y, BUTTON_SIZE, BUTTON_SIZE); ChoisirCouleurDessin(CouleurParNom("black")); draw_text_centered(x, y, BUTTON_SIZE, BUTTON_SIZE, (char*)text, 1); } /* Centre le texte dans une zone (x, y, w, h) */ static void draw_text_centered(int x, int y, int w, int h, const char *text, int size) { int text_w = TailleChaineEcran((char*)text, size); int text_h_sup = TailleSupPolice(size); /* Calcul de la position de départ pour centrer le texte */ int draw_x = x + (w - text_w) / 2; int draw_y = y + (h + text_h_sup) / 2; EcrireTexte(draw_x, draw_y, (char*)text, size); }