diff --git a/Pontu/entryPoints/main.c b/Pontu/entryPoints/main.c index 5cac622..94f8a73 100644 --- a/Pontu/entryPoints/main.c +++ b/Pontu/entryPoints/main.c @@ -69,7 +69,7 @@ int main(int argc, char *argv[]) { SDL_GetWindowSize(window, &windowW, &windowH); - size_t nbPlayers = 4; + int nbPlayers = 4; Player players[] = { newPlayer("Bépo", PlayerViolet), newPlayer("Azeryty", PlayerBlue), @@ -78,13 +78,13 @@ int main(int argc, char *argv[]) { }; //players[2] = ; - //bool crashed = gameCreationMenu(renderer, &generalState, &fontHandler, windowW, windowH, &players, &nbPlayers); + bool crashed = gameCreationMenu(renderer, &generalState, fontHandler.fonts[FONT_PublicPixel], windowW, windowH, players, &nbPlayers); /*if (crashed) { fprintf(stderr,"sorry"); exit(-1); }*/ - generalState = GS_Game; + //generalState = GS_Game; gameView(&generalState, window, renderer, players, nbPlayers, &fontHandler); diff --git a/Pontu/include/engine/ButtonActions.h b/Pontu/include/engine/ButtonActions.h new file mode 100644 index 0000000..a930d70 --- /dev/null +++ b/Pontu/include/engine/ButtonActions.h @@ -0,0 +1,18 @@ +#ifndef BUTTON_ACTION_INCLUDED +#define BUTTON_ACTION_INCLUDED + +#include "engine/Button.h" + + +void action_none(P_Button* caller); + +void action_print(P_Button* caller); + +/** + * @brief Button handle which set a generalState to GS_MainMenu + * + * @param caller The button clicked + */ +void action_setStateToMainMenu(P_Button* caller); + +#endif //BUTTON_ACTION_INCLUDED \ No newline at end of file diff --git a/Pontu/include/view/GameCreationMenu.h b/Pontu/include/view/GameCreationMenu.h index 44e46ab..38058d5 100644 --- a/Pontu/include/view/GameCreationMenu.h +++ b/Pontu/include/view/GameCreationMenu.h @@ -60,4 +60,4 @@ typedef struct TTF_Font* font; }DecrementParams; -bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState, TTF_Font* font, int width, int height); +bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState, TTF_Font* font, int width, int height, Player players[], int* nbPlayers); diff --git a/Pontu/include/view/GameInterface.h b/Pontu/include/view/GameInterface.h index 5d7649a..61c6763 100644 --- a/Pontu/include/view/GameInterface.h +++ b/Pontu/include/view/GameInterface.h @@ -12,6 +12,7 @@ #include "engine/Button.h" #include #include "engine/arrayButton.h" +#include "engine/GeneralState.h" /** @@ -26,7 +27,7 @@ void drawButtons(SDL_Renderer* renderer,FontHandler fontHandler); * \param fontHandler The fontHandler to apply * \return an array of P_Button to draw on the renderer */ -struct array_P_Button createGameInterfaceButtons(SDL_Renderer* renderer, FontHandler* fontHandler); +struct array_P_Button createGameInterfaceButtons(SDL_Renderer* renderer, FontHandler* fontHandler, GeneralState* generalState); /** diff --git a/Pontu/src/engine/Button.c b/Pontu/src/engine/Button.c index c80e226..8caf68d 100644 --- a/Pontu/src/engine/Button.c +++ b/Pontu/src/engine/Button.c @@ -2,10 +2,8 @@ #include #include #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)) { @@ -13,7 +11,7 @@ P_Button createButton(SDL_Texture* texture, SDL_Texture* hoverTexture ,const int 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. Il prend le onClick par défaut\n"); - b.onClick = onClickDefault; + b.onClick = action_none; } b.texture = texture; b.hoverTexture = hoverTexture; diff --git a/Pontu/src/engine/ButtonActions.c b/Pontu/src/engine/ButtonActions.c new file mode 100644 index 0000000..5494a83 --- /dev/null +++ b/Pontu/src/engine/ButtonActions.c @@ -0,0 +1,16 @@ +#include "engine/ButtonActions.h" +#include "engine/GeneralState.h" + + +void action_none(P_Button* caller) { +} + + +void action_print(P_Button* caller) { + printf("Button pressed\n"); +} + +void action_setStateToMainMenu(P_Button* caller) +{ + *((GeneralState*)caller->arg) = GS_MainMenu; +} diff --git a/Pontu/src/view/GameCreationMenu.c b/Pontu/src/view/GameCreationMenu.c index f8c7e15..8855329 100644 --- a/Pontu/src/view/GameCreationMenu.c +++ b/Pontu/src/view/GameCreationMenu.c @@ -2,11 +2,10 @@ #include -bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Font* font, int width, int height); void freeCreateMenuLine(CreateMenuLine* line); CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int xmax, TTF_Font* font, Player* player); void createPlayersLines(SDL_Renderer* renderer, TTF_Font* font, int minx, int maxx, int miny,int nbPlayer, CreateMenuLine* lines); -bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabels, P_Button* buttons, int nbButtons, CreateMenuLine* lines, int nbPlayer); +bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabels, P_Button* buttons, int nbButtons, CreateMenuLine* lines, int nbPlayer, const SDL_Color* bg); bool drawCreateMenuLine(SDL_Renderer* renderer, CreateMenuLine* line); void changePlayerColor(P_Button* caller); void decrementNbPlayer(P_Button* caller); @@ -67,9 +66,11 @@ void changePlayerColor(P_Button* caller) params->p->color = params->color; } -bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabels, P_Button* buttons, int nbButtons, CreateMenuLine* lines, int nbPlayer) +bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabels, P_Button* buttons, int nbButtons, CreateMenuLine* lines, int nbPlayer, const SDL_Color* bg) { //Draw everything + SDL_SetRenderDrawColor(renderer, bg->r, bg->g, bg->b, bg->a); + SDL_RenderClear(renderer); for(int i=0; icolorButtons[i]); } } -bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Font* font, int width, int height) + +bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Font* font, int width, int height, Player players[], int* nbPlayers) { - int nbPlayers = 2; + *nbPlayers = 2; int const nbLabels = 5; int nbButtons = 2; TextLabel *labels[nbLabels]; @@ -224,12 +226,12 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon // TextLabel for the number of players creation SDL_Point nbPlayerLabelPos = {.x=decrementBtn.rect.x+decrementBtn.rect.w+8, .y=decrementBtn.rect.y*1.5}; char nbPlayerStr[2]; - if(nbPlayers < 0 || nbPlayers > 9) + if(*nbPlayers < 0 || *nbPlayers > NB_PLAYER_MAX) { - fprintf(stderr, "WARNING: The number of players has to be between 0 and 9\n"); + fprintf(stderr, "WARNING: The number of players has to be between 0 and %d\n", NB_PLAYER_MAX); return false; } - nbPlayerStr[0] = nbPlayers + 48; // ASCII code of '0' is 48 and ASSCI code of '9' is 57 (48+9) + nbPlayerStr[0] = *nbPlayers + 48; // ASCII code of '0' is 48 and ASSCI code of '9' is 57 (48+9) nbPlayerStr[1] = '\0'; TextLabel nbPlayerLabel = createTextLabel( nbPlayerStr, @@ -310,17 +312,17 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon ); - createPlayersLines(renderer, font, titleLabelPos.x, incrementBtn.rect.x+incrementBtn.rect.w, colorLabel.textZone.y+colorLabel.textZone.h , nbPlayers, lines); + createPlayersLines(renderer, font, titleLabelPos.x, incrementBtn.rect.x+incrementBtn.rect.w, colorLabel.textZone.y+colorLabel.textZone.h , *nbPlayers, lines); labels[0] = &titleLabel; labels[1] = &nbPlayerLabel; labels[2] = &aiLabel; labels[3] = &pseudoLabel; labels[4] = &colorLabel; - DecrementParams dparams= {.nbPlayers=&nbPlayers, .lines=lines, .renderer=renderer, .bg = &bg, .nbPlayersLbl=&nbPlayerLabel, .bg=&bg, .font=font}; + DecrementParams dparams= {.nbPlayers=nbPlayers, .lines=lines, .renderer=renderer, .bg = &bg, .nbPlayersLbl=&nbPlayerLabel, .font=font}; decrementBtn.arg = &dparams; - IncrementParams iparams= {.nbPlayers=&nbPlayers, .lines=lines, .minx=titleLabelPos.x, .maxx=incrementBtn.rect.x+incrementBtn.rect.w, .miny=colorLabelPos.y+colorLabel.textZone.h + 16, .font=font, .renderer=renderer, .nbPlayersLbl=&nbPlayerLabel, .bg=&bg}; + IncrementParams iparams= {.nbPlayers=nbPlayers, .lines=lines, .minx=titleLabelPos.x, .maxx=incrementBtn.rect.x+incrementBtn.rect.w, .miny=colorLabelPos.y+colorLabel.textZone.h + 16, .font=font, .renderer=renderer, .nbPlayersLbl=&nbPlayerLabel, .bg=&bg}; incrementBtn.arg = &iparams; buttons[0] = decrementBtn; @@ -329,8 +331,8 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon InputProcessor inputProcessor = createInputProcessor(); array_P_Button_AddElement(&inputProcessor.tabButton, incrementBtn); array_P_Button_AddElement(&inputProcessor.tabButton, decrementBtn); - SDL_SetRenderDrawColor(renderer, bg.r, bg.g, bg.b, bg.a); - drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, nbPlayers); + + drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, *nbPlayers, &bg); while(*generalState == GS_GameCreationMenu) { InputElement inputElement; @@ -342,7 +344,7 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon switch (inputElement.data.uiAction) { case UIAction_Quit: - *generalState = GS_MainMenu; + *generalState = GS_Quit; break; case UIAction_Validate: break; @@ -356,32 +358,31 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon { if(inputElement.data.buttonEvent.button == &incrementBtn || inputElement.data.buttonEvent.button == &decrementBtn) { - nbPlayerLabel.text[0] = nbPlayers + 48; - SDL_RenderClear(renderer); - drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, nbPlayers); + nbPlayerLabel.text[0] = *nbPlayers + 48; + + drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, *nbPlayers, &bg); } } - case InputType_MoveGame: - - break; - case InputType_ClickGame: - - break; case InputType_None: default: break; } } - nbPlayerLabel.text[0] = nbPlayers+48; + nbPlayerLabel.text[0] = *nbPlayers+48; } - - //free freeInputProcessor(&inputProcessor); freeTextLabel(&titleLabel); freeButton(&incrementBtn); freeButton(&decrementBtn); + free(buttons); + + + for (size_t i=0; i<*nbPlayers; ++i) { + players[i] = newPlayer(lines[i].player->pseudo, lines[i].player->color); + freeCreateMenuLine(&lines[i]); + } return true; } diff --git a/Pontu/src/view/GameInterface.c b/Pontu/src/view/GameInterface.c index 818bc0e..1908dea 100644 --- a/Pontu/src/view/GameInterface.c +++ b/Pontu/src/view/GameInterface.c @@ -5,15 +5,9 @@ #include #include #include +#include -//void action boutton - -void action(P_Button* buttonCaller){ - printf("Bouton menu\n"); - //changeButtonTexture(arg->buttonCaller,arg->texture); -} - -struct array_P_Button createGameInterfaceButtons(SDL_Renderer* renderer, FontHandler* fontHandler) { +struct array_P_Button createGameInterfaceButtons(SDL_Renderer* renderer, FontHandler* fontHandler, GeneralState* generalState) { SDL_Color menuBorderColor= {0,0,255,255}; SDL_Color menuBackgroundColor = {0,255,0,255}; //SDL_Color menuBackgroundColor = {0,0,255,255}; @@ -35,11 +29,12 @@ struct array_P_Button createGameInterfaceButtons(SDL_Renderer* renderer, FontHan struct array_P_Button buttons = array_P_Button_Create(); // Menu - array_P_Button_AddElement(&buttons, createButton(menuButtonTexture, menuButtonHoverTexture,20,20,100,50,&action)); //top left corner (rectangle) + array_P_Button_AddElement(&buttons, createButton(menuButtonTexture, menuButtonHoverTexture,20,20,100,50,&action_setStateToMainMenu)); //top left corner (rectangle) + array_P_Button_Last(&buttons)->arg = (void*)generalState; // Settings - array_P_Button_AddElement(&buttons, createButton(settingsButtonTexture, settingsButtonHoverTexture, 750,10,50,50,&action)); //top right corner (square or circle) + array_P_Button_AddElement(&buttons, createButton(settingsButtonTexture, settingsButtonHoverTexture, 750,10,50,50,&action_print)); //top right corner (square or circle) // Mute/Unmute - array_P_Button_AddElement(&buttons, createButton(muteButtonTexture, muteButtonHoverTexture, 825,10,50,50,&action)); //top right cornre (square or circle) + array_P_Button_AddElement(&buttons, createButton(muteButtonTexture, muteButtonHoverTexture, 825,10,50,50,&action_print)); //top right cornre (square or circle) return buttons; } @@ -130,9 +125,9 @@ void drawButtons(SDL_Renderer* renderer, FontHandler fontHandler) SDL_Texture *menuButtonHoverTexture = createGenericButtonTexture("MenuHover", fontHandler.fonts[FONT_retro], 125, menuBorderColor,menuBackgroundColor,24,5,&sizex,&sizey,renderer); //Buttons - P_Button menuButton = createButton(menuButtonTexture, menuButtonHoverTexture,20,20,100,50,&action); //top left corner (rectangle) - P_Button settingButton = createButton(menuButtonTexture, menuButtonHoverTexture, 750,10,50,50,&action); //top right corner (square or circle) - P_Button soundButton = createButton(menuButtonTexture, menuButtonHoverTexture, 825,10,50,50,&action); //top right cornre (square or circle) + P_Button menuButton = createButton(menuButtonTexture, menuButtonHoverTexture,20,20,100,50,&action_print); //top left corner (rectangle) + P_Button settingButton = createButton(menuButtonTexture, menuButtonHoverTexture, 750,10,50,50,&action_print); //top right corner (square or circle) + P_Button soundButton = createButton(menuButtonTexture, menuButtonHoverTexture, 825,10,50,50,&action_print); //top right cornre (square or circle) //Labels TextLabel nbTurnLabel = createTextLabel("Turn : ",&positonNbTurnLabel,1,&colorLabel,fontHandler.fonts[FONT_retro],renderer,positionX,positionY); diff --git a/Pontu/src/view/GameMain.c b/Pontu/src/view/GameMain.c index 78f2170..2162c09 100644 --- a/Pontu/src/view/GameMain.c +++ b/Pontu/src/view/GameMain.c @@ -44,7 +44,7 @@ void gameView(GeneralState* generalState, SDL_Window* window, SDL_Renderer* rend Game game = newGame(nbPlayers, players); TextureHandler textureHandler = newTextureHandler(renderer); - inputProcessor.tabButton = createGameInterfaceButtons(renderer, fontHandler); + inputProcessor.tabButton = createGameInterfaceButtons(renderer, fontHandler, generalState); struct array_TextLabel tabLabel = createGameInterfaceLabels(renderer,fontHandler); diff --git a/Pontu/src/view/MenuEndGame.c b/Pontu/src/view/MenuEndGame.c index 799e163..c58853f 100644 --- a/Pontu/src/view/MenuEndGame.c +++ b/Pontu/src/view/MenuEndGame.c @@ -7,6 +7,7 @@ #include "engine/UIElementUtils.h" #include "engine/arrayTextLabel.h" #include "engine/arrayPositionSpecifier.h" +#include "engine/ButtonActions.h" struct endGameMenuTextLabel { @@ -14,15 +15,6 @@ struct endGameMenuTextLabel { struct array_PositionSpecifier positionSpecifiers; }; -/** - * @brief Button handle which set a generalState to GS_MainMenu - * - * @param caller The button clicked - */ -void setStateToMainMenu(P_Button* caller) { - *((GeneralState*)caller->arg) = GS_MainMenu; -} - SDL_Rect getEndGameMenuRect(SDL_Window* window) { int windowW; int windowH; @@ -62,7 +54,7 @@ P_Button createButtonForEndGameMenu(SDL_Renderer* renderer, TTF_Font* font, cons } - P_Button buttonMenuEndGame = createButton(texture, textureHover, rect->x, rect->y, sizeX, sizeY, &setStateToMainMenu); + P_Button buttonMenuEndGame = createButton(texture, textureHover, rect->x, rect->y, sizeX, sizeY, &action_setStateToMainMenu); buttonMenuEndGame.arg = state; buttonMenuEndGame.rect.y = rect->h*8/10; buttonMenuEndGame.rect.x = rect->x + rect->w/2-buttonMenuEndGame.rect.w/2; @@ -171,6 +163,8 @@ void drawEndGameMenu(SDL_Renderer* renderer, const SDL_Rect rectMenuEndGame, str } void endGameMenu(GeneralState* generalState, SDL_Window* window, SDL_Renderer* renderer, FontHandler* fontHandler, const Player players[], const size_t nbPlayers) { + if (*generalState != GS_EndOfGameMenu) return; + InputProcessor inputProcessor = createInputProcessor(); const SDL_Rect endGameMenuRect = getEndGameMenuRect(window); array_P_Button_AddElement(&inputProcessor.tabButton, createButtonForEndGameMenu(renderer, fontHandler->fonts[FONT_retro], &endGameMenuRect, generalState));