diff --git a/Pontu/entryPoints/main.c b/Pontu/entryPoints/main.c index 834c110..1470c8e 100644 --- a/Pontu/entryPoints/main.c +++ b/Pontu/entryPoints/main.c @@ -11,7 +11,7 @@ int main(int argc, char *argv[]) { SDL_Rect windowSize = {10, 10, 900, 900}; - + SDL_Window* window = NULL; SDL_Renderer* renderer = NULL; @@ -48,6 +48,7 @@ int main(int argc, char *argv[]) { switch (generalState) { case GS_MainMenu: mainMenu(renderer,window,&generalState, fontHandler, audioHandler); + playSFX(validate_sound, audioHandler) break; case GS_GameCreationMenu:{ int windowW; @@ -73,7 +74,7 @@ int main(int argc, char *argv[]) { generalState = GS_Game; gameView(&generalState, window, renderer, players, nbPlayers, &fontHandler); - + //Pour tester le endGameMenu directement /*generalState = GS_EndOfGameMenu; players[0].eliminationTurn = 10; diff --git a/Pontu/include/engine/AudioHandler.h b/Pontu/include/engine/AudioHandler.h index 01be82c..21910ea 100644 --- a/Pontu/include/engine/AudioHandler.h +++ b/Pontu/include/engine/AudioHandler.h @@ -32,7 +32,8 @@ */ #define MACRO_FOR_ALL_SFX(M) \ M(testClick) \ - M(menu_sound_effect) + M(menu_sound_effect) \ + M(validate_sound) /** * Macro used to generate the entries for the musics in #EnumAudios. diff --git a/Pontu/include/engine/Button.h b/Pontu/include/engine/Button.h index 079390c..c4ec395 100644 --- a/Pontu/include/engine/Button.h +++ b/Pontu/include/engine/Button.h @@ -13,6 +13,8 @@ struct P_buttonArg; +enum {BUTTON_NOTHING, BUTTON_ENTRY, BUTTON_EXIT}; + /** * \struct P_Button * \brief Represents a button @@ -23,7 +25,7 @@ typedef struct P_button SDL_Texture* hoverTexture; ///> texture to draw when the button is hovered SDL_Rect rect; ///> defines coordinates and size for hitbox and display void (*onClick)(struct P_button* buttonCaller); ///> action done on click - bool drawn; ///> is the button drawn + bool enable; ///> is the button enable and drawable bool hover; ///> is the button hovered void* arg; } P_Button; diff --git a/Pontu/rsrc/sfx/menu_sound_effect.wav b/Pontu/rsrc/sfx/menu_sound_effect.wav index 97c4e87..4e79194 100644 Binary files a/Pontu/rsrc/sfx/menu_sound_effect.wav and b/Pontu/rsrc/sfx/menu_sound_effect.wav differ diff --git a/Pontu/rsrc/sfx/validate_sound.wav b/Pontu/rsrc/sfx/validate_sound.wav new file mode 100644 index 0000000..39d5059 Binary files /dev/null and b/Pontu/rsrc/sfx/validate_sound.wav differ diff --git a/Pontu/src/engine/Button.c b/Pontu/src/engine/Button.c index 475930f..c711ef6 100644 --- a/Pontu/src/engine/Button.c +++ b/Pontu/src/engine/Button.c @@ -6,7 +6,7 @@ P_Button createButton(SDL_Texture* texture, SDL_Texture* hoverTexture ,const int coordx, const int coordy, const int sizex, const int sizey, void (*onClick)(P_Button* buttonCaller)) { // Declarations - P_Button b = { .rect = { .x = coordx, .y = coordy, .w = sizex, .h = sizey }, .onClick = onClick, .drawn = false}; + P_Button b = { .rect = { .x = coordx, .y = coordy, .w = sizex, .h = sizey }, .onClick = onClick, .enable = true}; if(onClick == NULL) fprintf(stderr, "Attention: aucune action onClick n'est passé au bouton.\n"); b.texture = texture; @@ -18,19 +18,20 @@ P_Button createButton(SDL_Texture* texture, SDL_Texture* hoverTexture ,const int bool drawButtonOnRenderer(SDL_Renderer* renderer, P_Button* button) { SDL_SetRenderTarget(renderer, NULL); + if(button->enable == false) + return false; if(SDL_RenderCopy(renderer,button->hover && button->hoverTexture != NULL ? button->hoverTexture : button->texture,NULL,&(button->rect))) { fprintf(stderr,"SDLWarning: %s\n",SDL_GetError()); return false; } - button->drawn = true; //printf("Redraw de %p\n",button); return true; } bool isHover(P_Button* button) { - return button->hover && button->drawn; + return button->hover && button->enable; } bool changeButtonTexture(P_Button* button, SDL_Texture* texture) @@ -65,12 +66,12 @@ int isButtonInteractWithCursor(P_Button * button,const int x,const int y){ if(isHover(button)){ button->hover = SDL_PointInRect(&coord,&(button->rect)); if(button->hover == false){ - return 2; + return BUTTON_EXIT; } - return 0; + return BUTTON_NOTHING; } button->hover = SDL_PointInRect(&coord,&(button->rect)); if(button->hover) - return 1; - return 0; + return BUTTON_ENTRY; + return BUTTON_NOTHING; } diff --git a/Pontu/src/view/MainMenu.c b/Pontu/src/view/MainMenu.c index 5f0d734..0e98b89 100644 --- a/Pontu/src/view/MainMenu.c +++ b/Pontu/src/view/MainMenu.c @@ -114,32 +114,16 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general } break; case SDL_MOUSEMOTION: - switch (isButtonInteractWithCursor(&(buttons[0]),event.motion.x,event.motion.y)) { - case 1: - drawButtonOnRenderer(renderer,&(buttons[0])); - playSFX(SFX_menu_sound_effect, audioHandler); - break; - case 2: - drawButtonOnRenderer(renderer,&(buttons[0])); - break; - } - switch (isButtonInteractWithCursor(&(buttons[1]),event.motion.x,event.motion.y)) { - case 1: - drawButtonOnRenderer(renderer,&(buttons[1])); - playSFX(SFX_menu_sound_effect, audioHandler); - break; - case 2: - drawButtonOnRenderer(renderer,&(buttons[1])); - break; - } - switch (isButtonInteractWithCursor(&(buttons[2]),event.motion.x,event.motion.y)) { - case 1: - drawButtonOnRenderer(renderer,&(buttons[2])); - playSFX(SFX_menu_sound_effect, audioHandler); - break; - case 2: - drawButtonOnRenderer(renderer,&(buttons[2])); - break; + for (size_t i = 0; i < nb; i++) { + switch (isButtonInteractWithCursor(&(buttons[i]),event.motion.x,event.motion.y)) { + case 1: + drawButtonOnRenderer(renderer,&(buttons[i])); + playSFX(SFX_menu_sound_effect, audioHandler); + break; + case 2: + drawButtonOnRenderer(renderer,&(buttons[i])); + break; + } } break; case SDL_WINDOWEVENT: @@ -152,9 +136,10 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general event.window.data2); windowSize.w = event.window.data1; windowSize.h = event.window.data2; - buttons[0].rect.x = (windowSize.w/2)-(buttons[0].rect.w/2); - buttons[1].rect.x = (windowSize.w/2)-(buttons[1].rect.w/2); - buttons[2].rect.x = (windowSize.w/2)-(buttons[2].rect.w/2); + for (size_t i = 0; i < nb; i++) { + buttons[i].rect.x = (windowSize.w/2)-(buttons[i].rect.w/2); + drawButtonOnRenderer(renderer,&(buttons[i])); + } } break; default: diff --git a/Pontu/src/view/MenuEndGame.c b/Pontu/src/view/MenuEndGame.c index 7aeba34..81d3c9f 100644 --- a/Pontu/src/view/MenuEndGame.c +++ b/Pontu/src/view/MenuEndGame.c @@ -16,7 +16,7 @@ struct endGameMenuTextLabel { /** * @brief Button handle which set a generalState to GS_MainMenu - * + * * @param caller The button clicked */ void setStateToMainMenu(P_Button* caller) { @@ -29,9 +29,9 @@ SDL_Rect getEndGameMenuRect(SDL_Window* window) { SDL_GetWindowSize(window, &windowW, &windowH); SDL_Rect rect = { - .x=windowW/10, - .y=0, - .w=windowW*80/100, + .x=windowW/10, + .y=0, + .w=windowW*80/100, .h=windowH }; return rect; @@ -39,17 +39,17 @@ SDL_Rect getEndGameMenuRect(SDL_Window* window) { /** * @brief Create button For EndGameMenu - * - * @param renderer The renderer where buttons will be drawn + * + * @param renderer The renderer where buttons will be enable * @param font Font used by buttons - * @param rect Rect in which the endGameMenu is drawn - * @param state generalState which will be attached to the button - * @return P_Button + * @param rect Rect in which the endGameMenu is enable + * @param state generalState which will be attached to the button + * @return P_Button */ P_Button createButtonForEndGameMenu(SDL_Renderer* renderer, TTF_Font* font, const SDL_Rect* rect, GeneralState* state) { int sizeX; int sizeY; - + SDL_Texture* texture = createGenericButtonTexture("Retour menu", font, 50, COLOR_GENERIC_BUTTON_BORDER, COLOR_GENERIC_BUTTON_BACKGROUND, 4, 4, &sizeX, &sizeY, renderer); if (texture == NULL) { perror(SDL_GetError()); @@ -60,7 +60,7 @@ P_Button createButtonForEndGameMenu(SDL_Renderer* renderer, TTF_Font* font, cons perror(SDL_GetError()); exit(errno); } - + P_Button buttonMenuEndGame = createButton(texture, textureHover, rect->x, rect->y, sizeX, sizeY, &setStateToMainMenu); buttonMenuEndGame.arg = state; @@ -85,7 +85,7 @@ TextLabel createEliminationTurnLabel(SDL_Renderer* renderer, TTF_Font* font, con sprintf(text, "Tour: %d", eliminationTurn); TextLabel label = createUnsizedTextLabel(text, color, font, renderer); - + free(text); return label; @@ -150,7 +150,7 @@ struct endGameMenuTextLabel createLabels(SDL_Renderer* renderer, const Player pl for (size_t i=0; ifonts[FONT_retro], &PLAYER_SDL_COLORS[players[i].color], players[i].rank, players[i].pseudo)); array_PositionSpecifier_AddElement(&labels.positionSpecifiers, getPseudoAndRankPositionSpecifier(&array_TextLabel_Last(&labels.textLabels)->textZone, players[i].rank)); - + array_TextLabel_AddElement(&labels.textLabels, createEliminationTurnLabel(renderer, fontHandler->fonts[FONT_retro], &PLAYER_SDL_COLORS[players[i].color], players[i].eliminationTurn)); array_PositionSpecifier_AddElement(&labels.positionSpecifiers, getEliminationTurnPositionSpecifier(&array_TextLabel_Last(&labels.textLabels)->textZone, players[i].rank)); } @@ -159,10 +159,10 @@ struct endGameMenuTextLabel createLabels(SDL_Renderer* renderer, const Player pl void drawEndGameMenu(SDL_Renderer* renderer, const SDL_Rect rectMenuEndGame, struct endGameMenuTextLabel* labels) { - + SDL_SetRenderDrawColor(renderer, 220,220,220,255); SDL_RenderFillRect(renderer, &rectMenuEndGame); - + for (size_t i=0; itextLabels.size; ++i) { labels->textLabels.elems[i].textZone = adaptPosToRect(&labels->positionSpecifiers.elems[i], &rectMenuEndGame); drawTextLabel(renderer, &labels->textLabels.elems[i]); @@ -184,10 +184,10 @@ void endGameMenu(GeneralState* generalState, SDL_Window* window, SDL_Renderer* r }; PositionSpecifier positionSpecifierButtonRetour = newPositionSpecifier(&base100, POSX_CENTER, POSY_BOTTOM, ASPECT_KEEP_FIT); buttonMenuEndGame->rect = adaptPosToRect(&positionSpecifierButtonRetour, &endGameMenuRect); - buttonMenuEndGame->drawn = false; - + buttonMenuEndGame->enable = false; + struct endGameMenuTextLabel labels = createLabels(renderer, players, nbPlayers, fontHandler); - + drawEndGameMenu(renderer, endGameMenuRect, &labels); while(*generalState == GS_EndOfGameMenu) @@ -213,36 +213,36 @@ void endGameMenu(GeneralState* generalState, SDL_Window* window, SDL_Renderer* r } break; case InputType_Window_Resize: { - + const SDL_Rect rectM = { - .x=inputElement.data.windowSize.w/10, - .y=0, - .w=inputElement.data.windowSize.w*80/100, + .x=inputElement.data.windowSize.w/10, + .y=0, + .w=inputElement.data.windowSize.w*80/100, .h=inputElement.data.windowSize.h }; drawEndGameMenu(renderer, rectM, &labels); - + buttonMenuEndGame->rect = adaptPosToRect(&positionSpecifierButtonRetour, &rectM); - buttonMenuEndGame->drawn = false; + buttonMenuEndGame->enable = false; fprintf(stderr, "Resize\n"); fflush(stderr); - } + } default: break; } } } - if (!buttonMenuEndGame->drawn) { + if (!buttonMenuEndGame->enable) { drawButtonOnRenderer(renderer, buttonMenuEndGame); SDL_RenderPresent(renderer); } - + SDL_Delay(50); } freeInputProcessor(&inputProcessor); - + for (size_t i=0; i