diff --git a/Pontu/entryPoints/main.c b/Pontu/entryPoints/main.c index 1470c8e..a669351 100644 --- a/Pontu/entryPoints/main.c +++ b/Pontu/entryPoints/main.c @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) { switch (generalState) { case GS_MainMenu: mainMenu(renderer,window,&generalState, fontHandler, audioHandler); - playSFX(validate_sound, audioHandler) + playSFX(SFX_validate_sound, audioHandler); break; case GS_GameCreationMenu:{ int windowW; @@ -73,16 +73,16 @@ int main(int argc, char *argv[]) { }*/ generalState = GS_Game; - gameView(&generalState, window, renderer, players, nbPlayers, &fontHandler); + //gameView(&generalState, window, renderer, players, nbPlayers, &fontHandler); //Pour tester le endGameMenu directement - /*generalState = GS_EndOfGameMenu; + generalState = GS_EndOfGameMenu; players[0].eliminationTurn = 10; players[0].rank = 3; players[1].eliminationTurn = 15; players[1].rank = 2; players[2].eliminationTurn = 0; - players[2].rank = 1;*/ + players[2].rank = 1; endGameMenu(&generalState, window, renderer, &fontHandler, players, nbPlayers); break; diff --git a/Pontu/include/engine/Button.h b/Pontu/include/engine/Button.h index 0f2082d..e8815b2 100644 --- a/Pontu/include/engine/Button.h +++ b/Pontu/include/engine/Button.h @@ -13,7 +13,7 @@ struct P_buttonArg; -enum BUTTON_EVENT {BUTTON_NOTHING, BUTTON_ENTRY, BUTTON_EXIT}; +typedef enum {BUTTON_NOTHING, BUTTON_ENTRY, BUTTON_EXIT} ButtonEvent; /** * \struct P_Button diff --git a/Pontu/include/engine/InputElement.h b/Pontu/include/engine/InputElement.h index 792d667..0b83771 100644 --- a/Pontu/include/engine/InputElement.h +++ b/Pontu/include/engine/InputElement.h @@ -10,13 +10,14 @@ #include "model/Coord.h" +#include "engine/Button.h" /** * \enum InputType * \brief Different types for input */ -typedef enum {InputType_None, InputType_ClickGame, InputType_MoveGame, InputType_ActivateUI, InputType_Window_Resize} InputType; +typedef enum {InputType_None, InputType_ClickGame, InputType_MoveGame, InputType_ActivateUI, InputType_Window_Resize, InputType_ButtonChanged} InputType; /** * \enum UIAction @@ -47,6 +48,12 @@ typedef struct { int w; int h; } windowSize; ///< La nouvelle taille de l'ecran + + struct buttonEvent { + P_Button* button; + ButtonEvent event; + } buttonEvent; + } data; ///< Informations about the input InputType type; ///< Type of input @@ -86,4 +93,7 @@ InputElement createInputElementMoveBoard(const Coord start, const Coord end); */ InputElement createInputElementResizeWindow(); + +InputElement createInputElementButtonClicked(P_Button* button, const ButtonEvent event); + #endif // INPUT_ELEMENT_INCLUDED diff --git a/Pontu/include/engine/InputProcessor.h b/Pontu/include/engine/InputProcessor.h index 594923f..d8a6691 100644 --- a/Pontu/include/engine/InputProcessor.h +++ b/Pontu/include/engine/InputProcessor.h @@ -10,6 +10,8 @@ #include "engine/Button.h" #include "engine/arrayButton.h" +#include "engine/TextInput.h" +#include "engine/arrayTextInput.h" #include "engine/InputElement.h" /** @@ -19,6 +21,8 @@ typedef struct { struct array_P_Button tabButton; + struct array_TextInput tabTextInput; + TextInput* selectedTextInput; } InputProcessor; diff --git a/Pontu/include/engine/TextInput.h b/Pontu/include/engine/TextInput.h index e6641ca..cd8556e 100644 --- a/Pontu/include/engine/TextInput.h +++ b/Pontu/include/engine/TextInput.h @@ -27,7 +27,8 @@ typedef struct { char* value; - int cursorPosition; + Sint32 cursorPosition; + SDL_Rect size; bool isActive; SDL_Color textColor; diff --git a/Pontu/include/engine/arrayTextInput.h b/Pontu/include/engine/arrayTextInput.h new file mode 100644 index 0000000..f4a63d5 --- /dev/null +++ b/Pontu/include/engine/arrayTextInput.h @@ -0,0 +1,9 @@ +#ifndef ARRAY_TEXT_INPUT_INCLUDED +#define ARRAY_TEXT_INPUT_INCLUDED + +#include "engine/TextInput.h" +#include "engine/ArrayUtils.h" + +GENERATE_DYNAMIC_ARRAY(TextInput) + +#endif //ARRAY_TEXT_INPUT_INCLUDED diff --git a/Pontu/src/engine/Button.c b/Pontu/src/engine/Button.c index c711ef6..c80e226 100644 --- a/Pontu/src/engine/Button.c +++ b/Pontu/src/engine/Button.c @@ -3,12 +3,18 @@ #include #include +void onClickDefault(struct P_button* buttonCaller){ + //printf("Clicked on button: %p\n", buttonCaller); +} + 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, .enable = true}; - if(onClick == NULL) - fprintf(stderr, "Attention: aucune action onClick n'est passé au bouton.\n"); + if(onClick == NULL){ + fprintf(stderr, "Attention: aucune action onClick n'est passé au bouton. Il prend le onClick par défaut\n"); + b.onClick = onClickDefault; + } b.texture = texture; b.hoverTexture = hoverTexture; b.arg = NULL; @@ -17,10 +23,14 @@ 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))) + SDL_SetRenderTarget(renderer, NULL); + SDL_Texture * texture = button->hover && button->hoverTexture != NULL ? button->hoverTexture : button->texture; + SDL_Rect source = button->rect; + source.x = 0; + source.y = 0; + if(SDL_RenderCopy(renderer,texture,&source,&(button->rect))) { fprintf(stderr,"SDLWarning: %s\n",SDL_GetError()); return false; @@ -29,9 +39,9 @@ bool drawButtonOnRenderer(SDL_Renderer* renderer, P_Button* button) return true; } -bool isHover(P_Button* button) +bool isEnable(P_Button* button) { - return button->hover && button->enable; + return button->enable; } bool changeButtonTexture(P_Button* button, SDL_Texture* texture) @@ -59,11 +69,18 @@ void freeButton(P_Button * button){ SDL_DestroyTexture(button->hoverTexture); } +bool isHover(P_Button * button) { + return button->hover; +} + int isButtonInteractWithCursor(P_Button * button,const int x,const int y){ + if (!button->enable) return BUTTON_NOTHING; + SDL_Point coord; coord.x = x; coord.y = y; - if(isHover(button)){ + + if(button->hover){ button->hover = SDL_PointInRect(&coord,&(button->rect)); if(button->hover == false){ return BUTTON_EXIT; diff --git a/Pontu/src/engine/InputElement.c b/Pontu/src/engine/InputElement.c index 5a609c7..e0a2e13 100644 --- a/Pontu/src/engine/InputElement.c +++ b/Pontu/src/engine/InputElement.c @@ -30,3 +30,11 @@ InputElement createInputElementResizeWindow(const int w, const int h) { }; return i; } + +InputElement createInputElementButtonClicked(P_Button* button, const ButtonEvent event) { + InputElement i = { + .type = InputType_ButtonChanged, + .data.buttonEvent={.event=event, .button = button} + }; + return i; +} diff --git a/Pontu/src/engine/InputProcessor.c b/Pontu/src/engine/InputProcessor.c index 48594c5..ec68542 100644 --- a/Pontu/src/engine/InputProcessor.c +++ b/Pontu/src/engine/InputProcessor.c @@ -2,7 +2,8 @@ InputProcessor createInputProcessor() { InputProcessor inputProcessor = { - .tabButton = array_P_Button_Create() + .tabButton = array_P_Button_Create(), + .tabTextInput = array_TextInput_Create() }; return inputProcessor; } @@ -33,13 +34,32 @@ InputElement proccessInput(InputProcessor *inputProcessor) b->onClick(b); } } + bool textInputClicked = false; + for (size_t i = 0; itabTextInput.size; ++i) { + TextInput* ti = &inputProcessor->tabTextInput.elems[i]; + if (SDL_PointInRect(&mousePoint, &ti->size)) { + if (inputProcessor->selectedTextInput == NULL) { + SDL_StartTextInput(); + } + inputProcessor->selectedTextInput = ti; + textInputClicked = true; + break; + } + } + if (!textInputClicked) { + inputProcessor->selectedTextInput = NULL; + SDL_StopTextInput(); + } return createInputElementNone(); } case SDL_MOUSEMOTION: { for (size_t i = 0; itabButton.size; ++i) { P_Button* b = &inputProcessor->tabButton.elems[i]; - isButtonInteractWithCursor(b, event.motion.x, event.motion.y); + int res = isButtonInteractWithCursor(b, event.motion.x, event.motion.y); + if (res != BUTTON_NOTHING) { + return createInputElementButtonClicked(b, res); + } } break; } @@ -48,7 +68,12 @@ InputElement proccessInput(InputProcessor *inputProcessor) return createInputElementResizeWindow(event.window.data1, event.window.data2); } break; - + case SDL_TEXTINPUT: + + break; + case SDL_TEXTEDITING: + + break; } return createInputElementNone(); diff --git a/Pontu/src/view/GameInterface.c b/Pontu/src/view/GameInterface.c index 2a558ee..b685c61 100644 --- a/Pontu/src/view/GameInterface.c +++ b/Pontu/src/view/GameInterface.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include //void action boutton @@ -34,8 +36,8 @@ struct array_P_Button createGameInterfaceButtons(SDL_Renderer* renderer, FontHan struct array_TextLabel createGameInterfaceLabels(SDL_Renderer* renderer, FontHandler* fontHandler) { //Postion text label - SDL_Point positonNbTurnLabel = {.x=60, .y=800}; - SDL_Point positionTimeLablel = {.x=770, .y=800}; + SDL_Point positonNbTurnLabel = {.x=60, .y=850}; + SDL_Point positionTimeLablel = {.x=770, .y=850}; //Color labal SDL_Color colorLabel = {0, 255, 0, 255}; @@ -48,9 +50,9 @@ struct array_TextLabel createGameInterfaceLabels(SDL_Renderer* renderer, FontHan struct array_TextLabel labels = array_TextLabel_Create(); // Label : Nb Turn - TextLabel nbTurnLabel = createTextLabel("Turn : ",&positonNbTurnLabel,1,&colorLabel,fontHandler.fonts[FONT_retro],renderer,positionX,positionY); + TextLabel nbTurnLabel = createTextLabel("Turn : ",&positonNbTurnLabel,1,&colorLabel,fontHandler->fonts[FONT_retro],renderer,positionX,positionY); // Label : Time of the game - TextLabel timeLabel = createTextLabel("Time : ",&positionTimeLablel,1,&colorLabel,fontHandler.fonts[FONT_retro],renderer,positionX,positionY); + TextLabel timeLabel = createTextLabel("Time : ",&positionTimeLablel,1,&colorLabel,fontHandler->fonts[FONT_retro],renderer,positionX,positionY); //Add TextLabel to the array array_TextLabel_AddElement(&labels, nbTurnLabel); @@ -179,9 +181,5 @@ void drawButtons(SDL_Renderer* renderer, FontHandler fontHandler) } - //FREE TEXT LABEL + BUTTON - - - } \ No newline at end of file diff --git a/Pontu/src/view/GameMain.c b/Pontu/src/view/GameMain.c index 0dc182e..78f2170 100644 --- a/Pontu/src/view/GameMain.c +++ b/Pontu/src/view/GameMain.c @@ -3,6 +3,8 @@ #include "engine/GameInputProcessor.h" #include "engine/InputElement.h" #include "engine/TextureHandler.h" +#include "engine/arrayButton.h" +#include "engine/arrayTextLabel.h" #include "model/Game.h" #include "model/arrayCoord.h" @@ -43,6 +45,8 @@ void gameView(GeneralState* generalState, SDL_Window* window, SDL_Renderer* rend TextureHandler textureHandler = newTextureHandler(renderer); inputProcessor.tabButton = createGameInterfaceButtons(renderer, fontHandler); + struct array_TextLabel tabLabel = createGameInterfaceLabels(renderer,fontHandler); + SDL_Rect windowRect = {0,0,0,0}; SDL_GetWindowSize(window, &windowRect.w, &windowRect.h); @@ -57,6 +61,9 @@ void gameView(GeneralState* generalState, SDL_Window* window, SDL_Renderer* rend for (size_t i=0; iarg)) = GS_Quit; } @@ -30,35 +32,35 @@ P_Button* drawMainMenu(SDL_Renderer* renderer,const FontHandler fontHandler, uns *nb = 3; buttons = (P_Button*)malloc(sizeof(P_Button)*(*nb)); - buttons[0] = createButton(NULL,NULL,20, 20, 20, 20, generalStateToNewGame); + buttons[NEWGAME] = createButton(NULL,NULL,20, 20, 20, 20, generalStateToNewGame); - SDL_Texture* newGameButtonTexture = createGenericButtonTexture("Nouvelle Partie",font,fontSize,darkBlue,lightBlue,5, 10,&(buttons[0].rect.w),&(buttons[0].rect.h),renderer); + SDL_Texture* newGameButtonTexture = createGenericButtonTexture("Nouvelle Partie",font,fontSize,darkBlue,lightBlue,5, 10,&(buttons[NEWGAME].rect.w),&(buttons[NEWGAME].rect.h),renderer); SDL_Texture* newGameButtonTextureHover = createGenericButtonTexture("Nouvelle Partie",font,fontSize,lightBlue,darkBlue,5, 10,NULL,NULL,renderer); - buttons[0].texture = newGameButtonTexture; - buttons[0].hoverTexture = newGameButtonTextureHover; + buttons[NEWGAME].texture = newGameButtonTexture; + buttons[NEWGAME].hoverTexture = newGameButtonTextureHover; - buttons[0].rect.x = (windowSize->w/2)-(buttons[0].rect.w/2); - buttons[0].arg = generalState; + buttons[NEWGAME].rect.x = (windowSize->w/2)-(buttons[NEWGAME].rect.w/2); + buttons[NEWGAME].arg = generalState; - buttons[1] = createButton(NULL,NULL,20, buttons[0].rect.y+buttons[0].rect.h+20, 20, 20, NULL); + buttons[OPTION] = createButton(NULL,NULL,20, buttons[NEWGAME].rect.y+buttons[NEWGAME].rect.h+20, 20, 20, NULL); - SDL_Texture* optionButtonTexture = createGenericButtonTexture("Options",font,fontSize,darkBlue,lightBlue,5, 10,&(buttons[1].rect.w),&(buttons[1].rect.h),renderer); + 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); - buttons[1].texture = optionButtonTexture; - buttons[1].hoverTexture = optionButtonTextureHover; - buttons[1].rect.x = (windowSize->w/2)-(buttons[1].rect.w/2); + buttons[OPTION].texture = optionButtonTexture; + buttons[OPTION].hoverTexture = optionButtonTextureHover; + buttons[OPTION].rect.x = (windowSize->w/2)-(buttons[OPTION].rect.w/2); - buttons[2] = createButton(NULL,NULL,20, buttons[1].rect.y+buttons[1].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[2].rect.w),&(buttons[2].rect.h),renderer); + 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); - buttons[2].texture = quitButtonTexture; - buttons[2].hoverTexture = quitButtonTextureHover; - buttons[2].rect.x = (windowSize->w/2)-(buttons[2].rect.w/2); - buttons[2].arg = generalState; + buttons[QUIT].texture = quitButtonTexture; + buttons[QUIT].hoverTexture = quitButtonTextureHover; + buttons[QUIT].rect.x = (windowSize->w/2)-(buttons[QUIT].rect.w/2); + buttons[QUIT].arg = generalState; SDL_SetRenderTarget(renderer,NULL); @@ -90,9 +92,9 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general } SDL_Event event; - drawButtonOnRenderer(renderer,&(buttons[0])); - drawButtonOnRenderer(renderer,&(buttons[1])); - drawButtonOnRenderer(renderer,&(buttons[2])); + drawButtonOnRenderer(renderer,&(buttons[NEWGAME])); + drawButtonOnRenderer(renderer,&(buttons[OPTION])); + drawButtonOnRenderer(renderer,&(buttons[QUIT])); while(*generalState == GS_MainMenu) { @@ -104,13 +106,11 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general *generalState = GS_Quit; break; case SDL_MOUSEBUTTONUP: - if(isHover(&(buttons[2]))){ - buttons[2].onClick(&(buttons[2])); - break; - } - if(isHover(&(buttons[0]))){ - buttons[0].onClick(&(buttons[0])); - break; + for (size_t i = 0; i < nb; i++) { + if(isHover(&(buttons[i]))){ + buttons[i].onClick(&(buttons[i])); + break; + } } break; case SDL_MOUSEMOTION: @@ -143,7 +143,7 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general } break; default: - break; + break; } } SDL_RenderPresent(renderer); diff --git a/Pontu/src/view/MenuEndGame.c b/Pontu/src/view/MenuEndGame.c index f93a8cb..722e757 100644 --- a/Pontu/src/view/MenuEndGame.c +++ b/Pontu/src/view/MenuEndGame.c @@ -183,13 +183,13 @@ 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->enable = false; struct endGameMenuTextLabel labels = createLabels(renderer, players, nbPlayers, fontHandler); drawEndGameMenu(renderer, endGameMenuRect, &labels); drawButtonOnRenderer(renderer, buttonMenuEndGame); - SDL_RenderPresent(renderer); + + bool needToPresent = true; while(*generalState == GS_EndOfGameMenu) { @@ -224,9 +224,21 @@ void endGameMenu(GeneralState* generalState, SDL_Window* window, SDL_Renderer* r drawEndGameMenu(renderer, rectM, &labels); buttonMenuEndGame->rect = adaptPosToRect(&positionSpecifierButtonRetour, &rectM); - buttonMenuEndGame->enable = false; - - fprintf(stderr, "Resize\n"); fflush(stderr); + + drawButtonOnRenderer(renderer, buttonMenuEndGame); + + needToPresent = true; + break; + } + case InputType_ButtonChanged: { + switch (inputElement.data.buttonEvent.event) { + case BUTTON_ENTRY: + case BUTTON_EXIT: + fprintf(stderr, "Button changed"); fflush(stderr); + drawButtonOnRenderer(renderer, inputElement.data.buttonEvent.button); + needToPresent = true; + break; + } } default: break; @@ -234,9 +246,9 @@ void endGameMenu(GeneralState* generalState, SDL_Window* window, SDL_Renderer* r } } - if (!buttonMenuEndGame->enable) { - drawButtonOnRenderer(renderer, buttonMenuEndGame); + if (needToPresent) { SDL_RenderPresent(renderer); + needToPresent = false; } SDL_Delay(10);