diff --git a/Pontu/entryPoints/main.c b/Pontu/entryPoints/main.c index f737847..0addca0 100644 --- a/Pontu/entryPoints/main.c +++ b/Pontu/entryPoints/main.c @@ -61,7 +61,7 @@ int main(int argc, char *argv[]) { switch (generalState) { case GS_MainMenu: mainMenu(renderer,window,&generalState, fontHandler, audioHandler); - playSFX(SFX_validate_sound, audioHandler); + playSFX(SFX_validate_sound, &audioHandler); break; case GS_GameCreationMenu:{ int windowW; diff --git a/Pontu/include/engine/InputElement.h b/Pontu/include/engine/InputElement.h index 1ff9aed..00343dc 100644 --- a/Pontu/include/engine/InputElement.h +++ b/Pontu/include/engine/InputElement.h @@ -17,7 +17,7 @@ * \enum InputType * \brief Different types for input */ -typedef enum {InputType_None, InputType_ClickGame, InputType_MoveGame, InputType_ActivateUI, InputType_Window_Resize, InputType_ButtonChanged} InputType; +typedef enum {InputType_None, InputType_ClickGame, InputType_MoveGame, InputType_ActivateUI, InputType_Window_Resize, InputType_Window_Close, InputType_ButtonChanged} InputType; /** * \enum UIAction @@ -94,6 +94,8 @@ InputElement createInputElementMoveBoard(const Coord start, const Coord end); */ InputElement createInputElementResizeWindow(); +InputElement createInputElementCloseWindow(); + InputElement createInputElementButtonClicked(P_Button* button, const ButtonEvent event); diff --git a/Pontu/include/engine/InputProcessor.h b/Pontu/include/engine/InputProcessor.h index d8a6691..53e665c 100644 --- a/Pontu/include/engine/InputProcessor.h +++ b/Pontu/include/engine/InputProcessor.h @@ -35,7 +35,7 @@ InputProcessor createInputProcessor(); /** * @brief Free a game input processor - * + * * @param inputProcessor the game input processor to free (do not use after freeing) */ void freeInputProcessor(InputProcessor* inputProcessor); @@ -43,7 +43,7 @@ void freeInputProcessor(InputProcessor* inputProcessor); /** * \brief Poll and convert SDL_Events into specific event for Pontu - * + * * \param [in, out] inputProcessor The input processor which keeps a state of input in between calls * \return InputElement : an event for Pontu */ diff --git a/Pontu/src/engine/InputElement.c b/Pontu/src/engine/InputElement.c index e0a2e13..a35cc65 100644 --- a/Pontu/src/engine/InputElement.c +++ b/Pontu/src/engine/InputElement.c @@ -38,3 +38,8 @@ InputElement createInputElementButtonClicked(P_Button* button, const ButtonEvent }; return i; } + +InputElement createInputElementCloseWindow(){ + InputElement i = {.type = InputType_Window_Close}; + return i; +} diff --git a/Pontu/src/engine/InputProcessor.c b/Pontu/src/engine/InputProcessor.c index d4ff544..0cda1c4 100644 --- a/Pontu/src/engine/InputProcessor.c +++ b/Pontu/src/engine/InputProcessor.c @@ -76,6 +76,9 @@ InputElement proccessInput(InputProcessor *inputProcessor) if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { return createInputElementResizeWindow(event.window.data1, event.window.data2); } + if (event.window.event == SDL_WINDOWEVENT_CLOSE) { + return createInputElementCloseWindow(); + } break; case SDL_TEXTINPUT: addStringToInputTextValueAtCursor(inputProcessor->selectedTextInput, event.text.text); diff --git a/Pontu/src/engine/TextLabel.c b/Pontu/src/engine/TextLabel.c index 2bc8fe0..fd20bee 100644 --- a/Pontu/src/engine/TextLabel.c +++ b/Pontu/src/engine/TextLabel.c @@ -73,7 +73,7 @@ TextLabel createTextLabel(const char text[], const SDL_Point* pos, const float f switch (posXType) { case POSX_LEFT: - label.textZone.x = pos->x; + label.textZone.x = pos->x; break; case POSX_CENTER: label.textZone.x = pos->x-label.textZone.w/2; @@ -88,7 +88,7 @@ TextLabel createTextLabel(const char text[], const SDL_Point* pos, const float f switch (posYType) { case POSY_TOP: - label.textZone.y = pos->y; + label.textZone.y = pos->y; break; case POSY_CENTER: label.textZone.y = pos->y-label.textZone.h/2; @@ -105,7 +105,7 @@ TextLabel createTextLabel(const char text[], const SDL_Point* pos, const float f void freeTextLabel(TextLabel* label) { if (label == NULL) return; - + if (label->text != NULL){ free(label->text); label->text = NULL; @@ -125,4 +125,3 @@ void clearTextLabel(SDL_Renderer* renderer, const TextLabel* label, SDL_Color co SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a); SDL_RenderFillRect(renderer, &label->textZone); } - diff --git a/Pontu/src/view/MainMenu.c b/Pontu/src/view/MainMenu.c index 92db391..c8fa64d 100644 --- a/Pontu/src/view/MainMenu.c +++ b/Pontu/src/view/MainMenu.c @@ -10,6 +10,12 @@ enum {NEWGAME, OPTION, QUIT}; +struct optionArgs{ + SDL_Window* parent; + AudioHandler* ah; + FontHandler* fh; +}; + void quit(P_Button* buttonCaller) { *((GeneralState*)(buttonCaller->arg)) = GS_Quit; } @@ -18,6 +24,11 @@ void generalStateToNewGame(P_Button* buttonCaller) { *((GeneralState*)(buttonCaller->arg)) = GS_GameCreationMenu; } +void settingsViewAction(P_Button* buttonCaller){ + struct optionArgs* argStruct = (struct optionArgs*)buttonCaller->arg; + printf("Menu d'option\n"); + settingsView(argStruct->parent, argStruct->ah, argStruct->fh); +} P_Button* createMainMenu(SDL_Renderer* renderer,const FontHandler fontHandler, unsigned int* nb, const SDL_Rect* windowSize, GeneralState* generalState) { P_Button* buttons = (P_Button*)malloc(sizeof(P_Button)*3); @@ -43,8 +54,8 @@ P_Button* createMainMenu(SDL_Renderer* renderer,const FontHandler fontHandler, u buttons[NEWGAME].rect.x = (windowSize->w/2)-(buttons[NEWGAME].rect.w/2); buttons[NEWGAME].arg = generalState; - buttons[OPTION] = createButton(NULL,NULL,20, buttons[NEWGAME].rect.y+buttons[NEWGAME].rect.h+20, 20, 20, NULL); + buttons[OPTION] = createButton(NULL,NULL,20, buttons[NEWGAME].rect.y+buttons[NEWGAME].rect.h+20, 20, 20, settingsViewAction); SDL_Texture* optionButtonTexture = createGenericButtonTexture("Options",font,fontSize,darkBlue,lightBlue,5, 10,&(buttons[OPTION].rect.w),&(buttons[OPTION].rect.h),renderer); SDL_Texture* optionButtonTextureHover = createGenericButtonTexture("Options",font,fontSize,lightBlue,darkBlue,5, 10,NULL,NULL,renderer); @@ -52,8 +63,8 @@ P_Button* createMainMenu(SDL_Renderer* renderer,const FontHandler fontHandler, u buttons[OPTION].hoverTexture = optionButtonTextureHover; buttons[OPTION].rect.x = (windowSize->w/2)-(buttons[OPTION].rect.w/2); - buttons[QUIT] = createButton(NULL,NULL,20, buttons[OPTION].rect.y+buttons[OPTION].rect.h+20, 20, 20, quit); + buttons[QUIT] = createButton(NULL,NULL,20, buttons[OPTION].rect.y+buttons[OPTION].rect.h+20, 20, 20, quit); SDL_Texture* quitButtonTexture = createGenericButtonTexture("Quitter",font,fontSize,darkBlue,lightBlue,5, 10,&(buttons[QUIT].rect.w),&(buttons[QUIT].rect.h),renderer); SDL_Texture* quitButtonTextureHover = createGenericButtonTexture("Quitter",font,fontSize,lightBlue,darkBlue,5, 10,NULL,NULL,renderer); @@ -66,6 +77,7 @@ P_Button* createMainMenu(SDL_Renderer* renderer,const FontHandler fontHandler, u } int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * generalState,FontHandler fontHandler, AudioHandler audioHandler){ + // passer les handler par pointeur int statut = EXIT_FAILURE; @@ -88,6 +100,10 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general fprintf(stderr, "Le menu principale ne s'est pas instancié correctement\n"); return statut; } + + struct optionArgs optionArgs = {.parent = window, .ah = &audioHandler, .fh = &fontHandler}; + buttons[OPTION].arg = &optionArgs; + SDL_Event event; drawButtonOnRenderer(renderer,&(buttons[NEWGAME])); @@ -117,7 +133,7 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general switch (isButtonInteractWithCursor(&(buttons[i]),event.motion.x,event.motion.y)) { case 1: drawButtonOnRenderer(renderer,&(buttons[i])); - playSFX(SFX_menu_sound_effect, audioHandler); + playSFX(SFX_menu_sound_effect, &audioHandler); drawSomething = true; break; case 2: diff --git a/Pontu/src/view/Settings.c b/Pontu/src/view/Settings.c index ba440ba..d63687e 100644 --- a/Pontu/src/view/Settings.c +++ b/Pontu/src/view/Settings.c @@ -1,111 +1,64 @@ #include "view/Settings.h" - -#define NB_TEXT_LABEL 7 -#define NB_TEXTURES 2 -#define NB_BUTTONS 7 - -void onClick(P_Button* buttonCaller) { - printf("j'ai perdu %d\n",buttonCaller->rect.x); -} +#include "engine/InputProcessor.h" +#include "engine/InputElement.h" +#include "engine/arrayTextLabel.h" +#include // Global functions -RetValues drawSettingsView(SDL_Renderer* renderer, AudioHandler* ah, const FontHandler* fh) { - RetValues retValues = { .arr_textLabel = NULL}; - struct array_P_Button arr_buttons = array_P_Button_Create(); - SDL_Point title_point = {150,25}; - SDL_Point masterVolTitle_point = {150,75}; - SDL_Color blue = {52,158,235,255}; - SDL_Color black = {0,0,0,255}; - int hMinus, wMinus, hPlus, wPlus, wBack, hBack; - TextLabel* arr_textLabel; - if (NULL == (arr_textLabel = (TextLabel*)malloc(NB_TEXT_LABEL*sizeof(TextLabel)))) { - fprintf(stderr, "Malloc error with TextLabel\n"); - return retValues; - } - SDL_Texture** arr_textures; - if (NULL == (arr_textures = (SDL_Texture**)malloc(NB_TEXTURES*sizeof(SDL_Texture*)))) { - fprintf(stderr, "Malloc error with Textures\n"); - return retValues; - } - char tmp_str[4]; - - array_P_Button_Reserve(&arr_buttons, NB_BUTTONS); +enum nameTextLabel {TITRE, MUSIC_VOLUME, SFX_VOLUME, MASTER_VOLUME}; - arr_textLabel[0] = createTextLabel("Parametres", &title_point, 2.0, &black, - fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); +void createSettingsView(SDL_Window * window, SDL_Renderer* renderer, AudioHandler* ah, const FontHandler* fh, const InputProcessor * inputProcessor, struct array_TextLabel * arrayTextLabel, SDL_Texture * numberTexture) { + TTF_Font* font = fh->fonts[FONT_PublicPixel]; + SDL_Color white = {.r = 255, .g = 255, .b = 255, .a = 255}; + int windowWidth, windowHeight; + SDL_GetWindowSize(window, &windowWidth,&windowHeight); + SDL_Color lightBlue = {.r = 0,.g = 195,.b = 255,.a = 0}; //0, 195, 255 + SDL_Color darkBlue = {.r = 0,.g = 123,.b = 161,.a = 0}; //0, 123, 161 - arr_textures[0] = createGenericButtonTexture("-",fh->fonts[FONT_retro],32,black,blue, 0, 5, &wMinus, &hMinus, renderer); - arr_textures[1] = createGenericButtonTexture("+",fh->fonts[FONT_retro],32,black,blue, 0, 5, &wPlus, &hPlus, renderer); - arr_textures[2] = createGenericButtonTexture("Retour", fh->fonts[FONT_retro],32,black,blue,0,20,&wBack,&hBack,renderer); - - /* Master volume */ - // Title - arr_textLabel[1] = createTextLabel("Volume principal", &masterVolTitle_point, 1.25, &black, - fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); - // - button - array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[0], NULL, 0, arr_textLabel[1].textZone.y+arr_textLabel[1].textZone.h+20, wMinus, hMinus, onClick)); + //titre; + SDL_Point titre_point = {.x = windowWidth/2, .y = 30}; + TextLabel titre = createTextLabel("Options", &titre_point, 4,&white, font, renderer, POSX_CENTER, POSY_CENTER); + array_TextLabel_AddElement(arrayTextLabel, titre); - // + button - array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[1], NULL, 270, arr_textLabel[1].textZone.y+arr_textLabel[1].textZone.h+20, wPlus, hPlus, onClick)); - // Current value - sprintf(tmp_str, "%d", ah->masterVol); - arr_textLabel[2] = createTextLabel(tmp_str, &((SDL_Point) {150, arr_buttons.elems[1].rect.y+arr_buttons.elems[1].rect.h/2}), 1.5, &black, fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); - /* Music volume */ - // Title - arr_textLabel[3] = createTextLabel("Volume musique", &((SDL_Point) {150, arr_buttons.elems[1].rect.y+arr_buttons.elems[1].rect.h+20}), 1.5, &black, - fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + int padding_Label_Left = 20; + //Music volume label + SDL_Point musicVolumeLabelPoint = {.x = padding_Label_Left, .y = titre.textZone.h + 50 + titre.textZone.y}; + TextLabel musicVolumeLabel = createTextLabel("Music Volume", &musicVolumeLabelPoint, 1.5,&white, font, renderer, POSX_LEFT, POSY_CENTER); + array_TextLabel_AddElement(arrayTextLabel, musicVolumeLabel); - // - button - array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[0], NULL, 0, arr_textLabel[3].textZone.y+arr_textLabel[3].textZone.h+20, wMinus, hMinus, onClick)); - // + button - array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[1], NULL, 270, arr_textLabel[3].textZone.y+arr_textLabel[3].textZone.h+20, wPlus, hPlus, onClick)); + //SFX volume label + SDL_Point sfxVolumeLabelPoint = {.x = padding_Label_Left, .y = musicVolumeLabel.textZone.h + 50 + musicVolumeLabel.textZone.y}; + TextLabel sfxVolumeLabel = createTextLabel("Effect Volume", &sfxVolumeLabelPoint, 1.5,&white, font, renderer, POSX_LEFT, POSY_CENTER); + array_TextLabel_AddElement(arrayTextLabel, sfxVolumeLabel); - // Current value - sprintf(tmp_str, "%d", ah->volMusic); - arr_textLabel[4] = createTextLabel(tmp_str, &((SDL_Point) {150, arr_buttons.elems[3].rect.y+arr_buttons.elems[3].rect.h/2}), 1.5, &black, fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); - /* SFX Volume */ - // Title - arr_textLabel[5] = createTextLabel("Volume sons", &((SDL_Point) {150, arr_buttons.elems[3].rect.y+arr_buttons.elems[3].rect.h + 20}), 1.5, &black, - fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + //SFX volume label + SDL_Point masterVolumeLabelPoint = {.x = padding_Label_Left, .y = sfxVolumeLabel.textZone.h + 50 + sfxVolumeLabel.textZone.y}; + TextLabel masterVolumeLabel = createTextLabel("Master Volume", &masterVolumeLabelPoint, 1.5,&white, font, renderer, POSX_LEFT, POSY_CENTER); + array_TextLabel_AddElement(arrayTextLabel, masterVolumeLabel); - // - button - array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[0], NULL, 0, arr_textLabel[5].textZone.y+arr_textLabel[5].textZone.h+20, wMinus, hMinus, onClick)); - // + button - array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[1], NULL, 270, arr_textLabel[5].textZone.y+arr_textLabel[5].textZone.h+20, wPlus, hPlus, onClick)); - // Current value - sprintf(tmp_str, "%d", ah->volSFX); - arr_textLabel[6] = createTextLabel(tmp_str, &((SDL_Point) {150, arr_buttons.elems[5].rect.y+arr_buttons.elems[5].rect.h/2}), 1.5, &black, fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); - - /* Return button */ - array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[2], NULL, 150 - wBack/2, arr_buttons.elems[5].rect.y+arr_buttons.elems[5].rect.h + 20, wBack, hBack, onClick)); - - retValues.arr_buttons = arr_buttons; - retValues.arr_textLabel = arr_textLabel; - - return retValues; - + //quit button + P_Button quitButton = createButton(NULL,NULL,0, 0, 20, 20, NULL); + quitButton.texture = createGenericButtonTexture("Quitter",font,50,darkBlue,lightBlue,5, 10,&(quitButton.rect.w),&(quitButton.rect.h),renderer); + quitButton.hoverTexture = createGenericButtonTexture("Quitter",font,50,lightBlue,darkBlue,5, 10,NULL,NULL,renderer); + quitButton.rect.y = windowHeight - quitButton.rect.h - 50; + quitButton.rect.x = windowWidth/2 - quitButton.rect.w/2; + array_P_Button_AddElement(&inputProcessor->tabButton,quitButton); } void settingsView(SDL_Window* parent, AudioHandler* ah, const FontHandler* fh) { SDL_Window* window; SDL_Renderer* renderer; - SDL_Color white = {255,255,255,255}; - SDL_Color blue = {52,158,235,255}; - SDL_Rect title_area = {0,0,300,50}; - RetValues retValues; struct array_P_Button array_buttons; - bool stayInLoop = true; - SDL_Event event; - if (0 != SDL_CreateWindowAndRenderer(300,600,SDL_WINDOW_SHOWN, &window, &renderer)) { + if (0 != SDL_CreateWindowAndRenderer(500,600,SDL_WINDOW_SHOWN, &window, &renderer)) { fprintf(stderr,"Error when trying to create window or renderer: %s\n", SDL_GetError()); return; } @@ -114,28 +67,34 @@ void settingsView(SDL_Window* parent, AudioHandler* ah, const FontHandler* fh) { fprintf(stderr,"Warning: Can't set window as modal: %s\n",SDL_GetError()); } - SDL_SetRenderDrawColor(renderer, white.r, white.g, white.b, white.a); + SDL_Color bg = {55, 120, 175, 255}; + + SDL_SetRenderDrawColor(renderer, bg.r,bg.g,bg.b,bg.a); SDL_RenderClear(renderer); - SDL_SetRenderDrawColor(renderer, blue.r, blue.g, blue.b, blue.a); - SDL_RenderFillRect(renderer,&title_area); - retValues = drawSettingsView(renderer,ah,fh); + InputProcessor inputProcessor = createInputProcessor(); + struct array_TextLabel arrayTextLabel = array_TextLabel_Create(); + SDL_Texture * numberTexture[11]; + createSettingsView(window, renderer, ah, fh, &inputProcessor, &arrayTextLabel, numberTexture); - for (size_t i = 0; i < retValues.arr_buttons.size; i++) { - drawButtonOnRenderer(renderer, &(retValues.arr_buttons.elems[i])); - } - - for (size_t i = 0; i < NB_TEXT_LABEL; i++) { - drawTextLabel(renderer, &retValues.arr_textLabel[i]); - } - while (stayInLoop) { + //Title position and drawing + drawTextLabel(renderer,&arrayTextLabel.elems[TITRE]); + drawTextLabel(renderer,&arrayTextLabel.elems[MUSIC_VOLUME]); + drawTextLabel(renderer,&arrayTextLabel.elems[SFX_VOLUME]); + drawTextLabel(renderer,&arrayTextLabel.elems[MASTER_VOLUME]); + drawButtonOnRenderer(renderer,&inputProcessor.tabButton.elems[0]); + + + SDL_Event event; + bool etat = true; + while (etat) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_CLOSE: - stayInLoop = false; + etat = false; printf("Quit\n"); fflush(stdout); break; @@ -143,20 +102,6 @@ void settingsView(SDL_Window* parent, AudioHandler* ah, const FontHandler* fh) { break; } break; - case SDL_MOUSEBUTTONUP: - printf("MOUSEBUTTONUP\n"); - for (int i = 0; i < NB_BUTTONS; i++) { - printf("%d\n",i); - if (isButtonInteractWithCursor(&(retValues.arr_buttons.elems[i]),event.button.x,event.button.y)) { - printf("isHover\n"); - retValues.arr_buttons.elems[i].onClick(&(retValues.arr_buttons.elems[i])); - fflush(stdout); - break; - } - } - break; - default: - break; } } @@ -164,5 +109,8 @@ void settingsView(SDL_Window* parent, AudioHandler* ah, const FontHandler* fh) { SDL_RenderPresent(renderer); SDL_Delay(20); } -} +quit: + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); +} diff --git a/Pontu/src/view/Settings.c.old b/Pontu/src/view/Settings.c.old new file mode 100644 index 0000000..ba440ba --- /dev/null +++ b/Pontu/src/view/Settings.c.old @@ -0,0 +1,168 @@ +#include "view/Settings.h" + +#define NB_TEXT_LABEL 7 +#define NB_TEXTURES 2 +#define NB_BUTTONS 7 + +void onClick(P_Button* buttonCaller) { + printf("j'ai perdu %d\n",buttonCaller->rect.x); +} + +// Global functions + +RetValues drawSettingsView(SDL_Renderer* renderer, AudioHandler* ah, const FontHandler* fh) { + RetValues retValues = { .arr_textLabel = NULL}; + struct array_P_Button arr_buttons = array_P_Button_Create(); + SDL_Point title_point = {150,25}; + SDL_Point masterVolTitle_point = {150,75}; + SDL_Color blue = {52,158,235,255}; + SDL_Color black = {0,0,0,255}; + int hMinus, wMinus, hPlus, wPlus, wBack, hBack; + TextLabel* arr_textLabel; + if (NULL == (arr_textLabel = (TextLabel*)malloc(NB_TEXT_LABEL*sizeof(TextLabel)))) { + fprintf(stderr, "Malloc error with TextLabel\n"); + return retValues; + } + SDL_Texture** arr_textures; + if (NULL == (arr_textures = (SDL_Texture**)malloc(NB_TEXTURES*sizeof(SDL_Texture*)))) { + fprintf(stderr, "Malloc error with Textures\n"); + return retValues; + } + char tmp_str[4]; + + array_P_Button_Reserve(&arr_buttons, NB_BUTTONS); + + arr_textLabel[0] = createTextLabel("Parametres", &title_point, 2.0, &black, + fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + + arr_textures[0] = createGenericButtonTexture("-",fh->fonts[FONT_retro],32,black,blue, 0, 5, &wMinus, &hMinus, renderer); + arr_textures[1] = createGenericButtonTexture("+",fh->fonts[FONT_retro],32,black,blue, 0, 5, &wPlus, &hPlus, renderer); + arr_textures[2] = createGenericButtonTexture("Retour", fh->fonts[FONT_retro],32,black,blue,0,20,&wBack,&hBack,renderer); + + /* Master volume */ + // Title + arr_textLabel[1] = createTextLabel("Volume principal", &masterVolTitle_point, 1.25, &black, + fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + + // - button + array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[0], NULL, 0, arr_textLabel[1].textZone.y+arr_textLabel[1].textZone.h+20, wMinus, hMinus, onClick)); + + // + button + array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[1], NULL, 270, arr_textLabel[1].textZone.y+arr_textLabel[1].textZone.h+20, wPlus, hPlus, onClick)); + + // Current value + sprintf(tmp_str, "%d", ah->masterVol); + arr_textLabel[2] = createTextLabel(tmp_str, &((SDL_Point) {150, arr_buttons.elems[1].rect.y+arr_buttons.elems[1].rect.h/2}), 1.5, &black, fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + + /* Music volume */ + // Title + arr_textLabel[3] = createTextLabel("Volume musique", &((SDL_Point) {150, arr_buttons.elems[1].rect.y+arr_buttons.elems[1].rect.h+20}), 1.5, &black, + fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + + // - button + array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[0], NULL, 0, arr_textLabel[3].textZone.y+arr_textLabel[3].textZone.h+20, wMinus, hMinus, onClick)); + + // + button + array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[1], NULL, 270, arr_textLabel[3].textZone.y+arr_textLabel[3].textZone.h+20, wPlus, hPlus, onClick)); + + // Current value + sprintf(tmp_str, "%d", ah->volMusic); + arr_textLabel[4] = createTextLabel(tmp_str, &((SDL_Point) {150, arr_buttons.elems[3].rect.y+arr_buttons.elems[3].rect.h/2}), 1.5, &black, fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + + /* SFX Volume */ + // Title + arr_textLabel[5] = createTextLabel("Volume sons", &((SDL_Point) {150, arr_buttons.elems[3].rect.y+arr_buttons.elems[3].rect.h + 20}), 1.5, &black, + fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + + // - button + array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[0], NULL, 0, arr_textLabel[5].textZone.y+arr_textLabel[5].textZone.h+20, wMinus, hMinus, onClick)); + + // + button + array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[1], NULL, 270, arr_textLabel[5].textZone.y+arr_textLabel[5].textZone.h+20, wPlus, hPlus, onClick)); + + // Current value + sprintf(tmp_str, "%d", ah->volSFX); + arr_textLabel[6] = createTextLabel(tmp_str, &((SDL_Point) {150, arr_buttons.elems[5].rect.y+arr_buttons.elems[5].rect.h/2}), 1.5, &black, fh->fonts[FONT_retro], renderer, POSX_CENTER, POSY_CENTER); + + /* Return button */ + array_P_Button_AddElement(&arr_buttons, createButton(arr_textures[2], NULL, 150 - wBack/2, arr_buttons.elems[5].rect.y+arr_buttons.elems[5].rect.h + 20, wBack, hBack, onClick)); + + retValues.arr_buttons = arr_buttons; + retValues.arr_textLabel = arr_textLabel; + + return retValues; + +} + +void settingsView(SDL_Window* parent, AudioHandler* ah, const FontHandler* fh) { + SDL_Window* window; + SDL_Renderer* renderer; + SDL_Color white = {255,255,255,255}; + SDL_Color blue = {52,158,235,255}; + SDL_Rect title_area = {0,0,300,50}; + RetValues retValues; + struct array_P_Button array_buttons; + bool stayInLoop = true; + SDL_Event event; + + if (0 != SDL_CreateWindowAndRenderer(300,600,SDL_WINDOW_SHOWN, &window, &renderer)) { + fprintf(stderr,"Error when trying to create window or renderer: %s\n", SDL_GetError()); + return; + } + + if (0!=SDL_SetWindowModalFor(window, parent)) { + fprintf(stderr,"Warning: Can't set window as modal: %s\n",SDL_GetError()); + } + + SDL_SetRenderDrawColor(renderer, white.r, white.g, white.b, white.a); + SDL_RenderClear(renderer); + SDL_SetRenderDrawColor(renderer, blue.r, blue.g, blue.b, blue.a); + SDL_RenderFillRect(renderer,&title_area); + + retValues = drawSettingsView(renderer,ah,fh); + + for (size_t i = 0; i < retValues.arr_buttons.size; i++) { + drawButtonOnRenderer(renderer, &(retValues.arr_buttons.elems[i])); + } + + for (size_t i = 0; i < NB_TEXT_LABEL; i++) { + drawTextLabel(renderer, &retValues.arr_textLabel[i]); + } + + while (stayInLoop) { + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_WINDOWEVENT: + switch (event.window.event) { + case SDL_WINDOWEVENT_CLOSE: + stayInLoop = false; + printf("Quit\n"); + fflush(stdout); + break; + default: + break; + } + break; + case SDL_MOUSEBUTTONUP: + printf("MOUSEBUTTONUP\n"); + for (int i = 0; i < NB_BUTTONS; i++) { + printf("%d\n",i); + if (isButtonInteractWithCursor(&(retValues.arr_buttons.elems[i]),event.button.x,event.button.y)) { + printf("isHover\n"); + retValues.arr_buttons.elems[i].onClick(&(retValues.arr_buttons.elems[i])); + fflush(stdout); + break; + } + } + break; + default: + break; + } + + } + + SDL_RenderPresent(renderer); + SDL_Delay(20); + } +} +