diff --git a/Pontu/entryPoints/test.c b/Pontu/entryPoints/test.c index f431a15..87691ad 100644 --- a/Pontu/entryPoints/test.c +++ b/Pontu/entryPoints/test.c @@ -1,15 +1,16 @@ -// #include "../test/testTextureLoader.c" -// #include "../test/testFontLoader.c" -// #include "../test/testAudioHandler.c" -// #include "../test/testGenerateurTexture.c" -/*#include "../test/testButton.c" -#include "../test/testTextInput.c" -#include "../test/testConnectionMenu.c"*/ -#include "../test/testMenuEndGame.c" -/*#include "../test/testGameInterface.c" -#include "../test/testConnectionMenu.c"*/ +//#include "../test/testTextureLoader.c" +//#include "../test/testFontLoader.c" +//#include "../test/testAudioHandler.c" +//#include "../test/testGenerateurTexture.c" +//#include "../test/testButton.c" +//#include "../test/testTextInput.c" +//#include "../test/testConnectionMenu.c" +//#include "../test/testMenuEndGame.c" +//#include "../test/testGameInterface.c" +//#include "../test/testConnectionMenu.c" //#include "../test/testDrawMainMenu.c //#include "../test/testSettingsView.c" +#include "../test/testCreationMenu.c" /* This file is meant to be modified (used only to called other tests functions) */ @@ -22,10 +23,11 @@ int main(int argc, char *argv[]) { //testTextInput(); //testButtonTextureLoader(); //testConnectionMenu(); - testMenuEndGame(); + //testMenuEndGame(); //testGameInterface(); //testConnectionMenu(); //testDrawMainMenu(); + testCreationMenu(); //testSettingsView(); return 0; diff --git a/Pontu/include/engine/Colors.h b/Pontu/include/engine/Colors.h index d15dd7a..83c5e6b 100644 --- a/Pontu/include/engine/Colors.h +++ b/Pontu/include/engine/Colors.h @@ -7,5 +7,9 @@ extern const SDL_Color COLOR_GENERIC_BUTTON_BACKGROUND; extern const SDL_Color COLOR_GENERIC_BUTTON_BORDER; extern const SDL_Color COLOR_GENERIC_BUTTON_BACKGROUND_HOVER; +extern const SDL_Color PLAYER_ONE_COLOR; +extern const SDL_Color PLAYER_TWO_COLOR; +extern const SDL_Color PLAYER_THREE_COLOR; +extern const SDL_Color PLAYER_FOUR_COLOR; #endif diff --git a/Pontu/include/view/GameCreationMenu.h b/Pontu/include/view/GameCreationMenu.h index 6e5300a..98522e1 100644 --- a/Pontu/include/view/GameCreationMenu.h +++ b/Pontu/include/view/GameCreationMenu.h @@ -5,5 +5,50 @@ #include "engine/TextureLoader.h" #include "engine/Colors.h" #include "engine/FontUtils.h" +#include "engine/GeneralState.h" +#include "engine/InputProcessor.h" +#include "engine/Colors.h" +#include "model/Player.h" +#include "engine/TextInput.h" + +#define NB_COLORS 4 +#define NB_PLAYER_MAX 4 + + +/* +bool drawGameCreationMenu(SDL_Renderer* renderer, P_Button* incrementBtn, P_Button* decrementBtn, TextLabel* nbJoueurTxtLabel, TextLabel* nbPlayerLabel); +*/ + +typedef struct +{ + P_Button aiButton; + P_Button* colorButtons; + TextInput pseudoInput; + Player* player; +}CreateMenuLine; + +typedef struct +{ + Player* p; + SDL_Color color; +} ChangeColorParams; + +typedef struct +{ + int* nbPlayers; + TTF_Font* font; + int minx; + int maxx; + int miny; + CreateMenuLine* lines; + SDL_Renderer* renderer; +}IncrementParams; + +typedef struct +{ + int* nbPlayers; + CreateMenuLine* lines; + SDL_Renderer* renderer; +}DecrementParams; -bool drawGameCreationMenu(SDL_Renderer* renderer, TTF_Font* font, int width, int height); +bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState, TTF_Font* font, int width, int height); diff --git a/Pontu/src/engine/Colors.c b/Pontu/src/engine/Colors.c index 1375ae6..1204c9b 100644 --- a/Pontu/src/engine/Colors.c +++ b/Pontu/src/engine/Colors.c @@ -3,3 +3,8 @@ const SDL_Color COLOR_GENERIC_BUTTON_BACKGROUND = {225, 225, 225, 255}; const SDL_Color COLOR_GENERIC_BUTTON_BORDER = {10, 10, 10, 255}; const SDL_Color COLOR_GENERIC_BUTTON_BACKGROUND_HOVER = {250, 250, 250, 255}; + +const SDL_Color PLAYER_ONE_COLOR = {166, 58, 252, 255}; +const SDL_Color PLAYER_TWO_COLOR = {14, 159, 100, 255}; +const SDL_Color PLAYER_THREE_COLOR = {240, 45, 45, 255}; +const SDL_Color PLAYER_FOUR_COLOR = {255, 255, 255, 255}; diff --git a/Pontu/src/view/GameCreationMenu.c b/Pontu/src/view/GameCreationMenu.c index 4cf9b85..5bc2912 100644 --- a/Pontu/src/view/GameCreationMenu.c +++ b/Pontu/src/view/GameCreationMenu.c @@ -1,14 +1,182 @@ #include "view/GameCreationMenu.h" -bool drawGameCreationMenu(SDL_Renderer* renderer, TTF_Font* font, int width, int height) +#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 drawCreateMenuLine(SDL_Renderer* renderer, CreateMenuLine* line); +void changePlayerColor(P_Button* caller); +void decrementNbPlayer(P_Button* caller); +void incrementNbPlayer(P_Button* caller); + + + + +void incrementNbPlayer(P_Button* caller) +{ + IncrementParams* params = (IncrementParams*) caller->arg; + int* nbPlayers = params->nbPlayers; + if(*nbPlayers == 4) + { + fprintf(stderr, "WARNING: Can't increment up to 5 and more\n"); + return; + } + ++(*nbPlayers); + createPlayersLines(params->renderer, params->font, params->minx, params->maxx, params->miny, *params->nbPlayers, params->lines); + drawCreateMenuLine(params->renderer, params->lines+*params->nbPlayers-1); +} +void decrementNbPlayer(P_Button* caller) +{ + DecrementParams* params = (DecrementParams*)caller->arg; + int* nbPlayers = params->nbPlayers; + if(*nbPlayers == 2) + { + fprintf(stderr, "WARNING: Can't decrement down to 1 and less\n"); + return; + } + freeCreateMenuLine(¶ms->lines[*nbPlayers-1]); + *nbPlayers -= 1; +} + +void changePlayerColor(P_Button* caller) +{ + ChangeColorParams* params = (ChangeColorParams*)caller->arg; + params->p->color = params->color; +} + +bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabels, P_Button* buttons, int nbButtons, CreateMenuLine* lines, int nbPlayer) +{ + //Draw everything + + for(int i=0; iaiButton); + for(int i=0; icolorButtons[i]); + } + drawTextInputOnRenderer(renderer, &line->pseudoInput); + return true; +} + +CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int xmax, TTF_Font* font, Player* player) +{ + int const wColorBtn = 32; + int const hColorBtn = 32; + int const colorBtnXMargin = 8; + SDL_Texture* btnTexture, *btnTextureHover; + SDL_Color const colors[NB_COLORS]= { + PLAYER_ONE_COLOR, + PLAYER_TWO_COLOR, + PLAYER_THREE_COLOR, + PLAYER_FOUR_COLOR + }; + P_Button* colorsBtn = (P_Button*) malloc(sizeof(P_Button)*NB_COLORS); + P_Button ai = createButton(NULL, NULL, xmin, y, 0, 0, NULL); + + CreateMenuLine line; + + SDL_Texture* aiTexture = createGenericButtonTexture("X", font, 16, COLOR_GENERIC_BUTTON_BACKGROUND, COLOR_GENERIC_BUTTON_BORDER, 4, 8, &(ai.rect.w), &(ai.rect.h), renderer); + SDL_Texture* aiTextureHovered = createGenericButtonTexture("X", font, 16, COLOR_GENERIC_BUTTON_BACKGROUND, COLOR_GENERIC_BUTTON_BACKGROUND, 4, 8, &ai.rect.w, &ai.rect.h, renderer); + ai.texture = aiTexture; + ai.hoverTexture = aiTextureHovered; + + SDL_Rect rect = {.x = xmin + ai.rect.x + ai.rect.w, .y = y, .h = TTF_FontHeight(font),.w = xmax - ai.rect.w - NB_COLORS * (wColorBtn + colorBtnXMargin*2)- 16}; + + TextInput pseudoInput; + initTextInput(&pseudoInput, &rect, NULL, font); + + ChangeColorParams* params; + + for(int i=0; ip = player; + params->color=colors[i]; + colorsBtn[i] = createButton(NULL, NULL, xmax-wColorBtn*(i+1), y, wColorBtn, hColorBtn, changePlayerColor); + colorsBtn[i].arg = params; + btnTexture = createGenericButtonTexture("", font, 0, COLOR_GENERIC_BUTTON_BORDER, colors[i], 4, 8, NULL, NULL, renderer); + btnTextureHover = createGenericButtonTexture("", font, 0, COLOR_GENERIC_BUTTON_BACKGROUND, colors[i], 4, 8, NULL, NULL, renderer); + colorsBtn[i].texture = btnTexture; + colorsBtn[i].hoverTexture = btnTextureHover; + + } + line.aiButton=ai; + line.colorButtons=colorsBtn; + line.player=player; + line.pseudoInput=pseudoInput; + return line; +} + +void freeCreateMenuLine(CreateMenuLine* line) { + destroyTextInput(&line->pseudoInput); + freeButton(&line->aiButton); + for(int i=0; icolorButtons[i].arg); + freeButton(&line->colorButtons[i]); + // free(&line->colorButtons[i]); + } +} +bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Font* font, int width, int height) +{ + int nbPlayers = 2; + int const nbLabels = 5; + int nbButtons = 2; + TextLabel *labels[nbLabels]; + P_Button* buttons = (P_Button*) malloc(sizeof(P_Button)*nbButtons); + + // TextLabel for "Nombre de joueur.euse.s" creation - SDL_Point nbJoueurLabelPos = {.x=width*0.05, .y=height*0.05}; - SDL_Color black = {0,0,0,255}; + SDL_Point titleLabelPos = {.x=width*0.05, .y=height*0.05}; SDL_Color white = {225, 255, 255, 255}; - TextLabel nbJoueurLabel = createTextLabel( - "Nombre de joueur.euse.s", - &nbJoueurLabelPos, + CreateMenuLine lines[NB_PLAYER_MAX]; + TextLabel titleLabel = createTextLabel( + "Nombre de joueur·euse·s", + &titleLabelPos, 1, &white, font, @@ -17,52 +185,181 @@ bool drawGameCreationMenu(SDL_Renderer* renderer, TTF_Font* font, int width, int POSY_TOP ); - // Incrementation Btn creation - - P_Button incrementBtn = createButton(NULL, NULL, nbJoueurLabelPos.x+calculateStringPixelLenght(font, nbJoueurLabel.text)+32, nbJoueurLabelPos.y, 0, 0, NULL); - SDL_Texture* btnTexture = createGenericButtonTexture("+", font, 8,COLOR_GENERIC_BUTTON_BACKGROUND, COLOR_GENERIC_BUTTON_BORDER, 4, 8, &(incrementBtn.rect.w), &(incrementBtn.rect.h), renderer); + // Decrementation Btn creation + P_Button decrementBtn = createButton(NULL, NULL, titleLabelPos.x+calculateStringPixelLenght(font, titleLabel.text)+32, titleLabelPos.y, 0, 0, &decrementNbPlayer); + SDL_Texture* btnTexture = createGenericButtonTexture("-", font, 8,COLOR_GENERIC_BUTTON_BACKGROUND, COLOR_GENERIC_BUTTON_BORDER, 4, 8, &(decrementBtn.rect.w), &(decrementBtn.rect.h), renderer); if(btnTexture == NULL) { fprintf(stderr, "WARNING: Can't create texture: %s\n", SDL_GetError()); return false; } - SDL_Texture* btnHoveredTexture = createGenericButtonTexture("+", font, 8, COLOR_GENERIC_BUTTON_BORDER, COLOR_GENERIC_BUTTON_BACKGROUND, 4, 8, &(incrementBtn.rect.w), &(incrementBtn.rect.h), renderer); + SDL_Texture* btnHoveredTexture = createGenericButtonTexture("-", font, 8, COLOR_GENERIC_BUTTON_BORDER, COLOR_GENERIC_BUTTON_BACKGROUND, 4, 8, &(decrementBtn.rect.w), &(decrementBtn.rect.h), renderer); if(btnHoveredTexture == NULL) { fprintf(stderr, "WARNING: Can't create hover texture: %s\n", SDL_GetError()); return false; } - incrementBtn.texture = btnTexture; - incrementBtn.hoverTexture = btnHoveredTexture; + decrementBtn.texture = btnTexture; + decrementBtn.hoverTexture = btnHoveredTexture; - // Decrementation Btn creation - - P_Button decrementBtn = createButton(NULL, NULL, nbJoueurLabelPos.x+calculateStringPixelLenght(font, nbJoueurLabel.text)+32, nbJoueurLabelPos.y, 0, 0, NULL); - btnTexture = createGenericButtonTexture("-", font, 8,COLOR_GENERIC_BUTTON_BACKGROUND, COLOR_GENERIC_BUTTON_BORDER, 4, 8, &(decrementBtn.rect.w), &(decrementBtn.rect.h), renderer); + // 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) + { + fprintf(stderr, "WARNING: The number of players has to be between 0 and 9\n"); + return false; + } + 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, + &nbPlayerLabelPos, + 1, + &white, + font, + renderer, + POSX_LEFT, + POSY_CENTER + ); + + + + + // Incrementation Btn creation + P_Button incrementBtn = createButton(NULL, NULL, nbPlayerLabel.textZone.x + nbPlayerLabel.textZone.w + 8, titleLabelPos.y, 0, 0, &incrementNbPlayer); + btnTexture = createGenericButtonTexture("+", font, 8,COLOR_GENERIC_BUTTON_BACKGROUND, COLOR_GENERIC_BUTTON_BORDER, 4, 8, &(incrementBtn.rect.w), &(incrementBtn.rect.h), renderer); if(btnTexture == NULL) { fprintf(stderr, "WARNING: Can't create texture: %s\n", SDL_GetError()); return false; } - btnHoveredTexture = createGenericButtonTexture("-", font, 8, COLOR_GENERIC_BUTTON_BORDER, COLOR_GENERIC_BUTTON_BACKGROUND, 4, 8, &(decrementBtn.rect.w), &(decrementBtn.rect.h), renderer); + btnHoveredTexture = createGenericButtonTexture("+", font, 8, COLOR_GENERIC_BUTTON_BORDER, COLOR_GENERIC_BUTTON_BACKGROUND, 4, 8, &(incrementBtn.rect.w), &(incrementBtn.rect.h), renderer); if(btnHoveredTexture == NULL) { fprintf(stderr, "WARNING: Can't create hover texture: %s\n", SDL_GetError()); return false; } - decrementBtn.texture = btnTexture; - decrementBtn.hoverTexture = btnHoveredTexture; + incrementBtn.texture = btnTexture; + incrementBtn.hoverTexture = btnHoveredTexture; - //Draw everything - drawButtonOnRenderer(renderer, &incrementBtn); - drawButtonOnRenderer(renderer, &decrementBtn); - drawTextLabel(renderer, &nbJoueurLabel); + SDL_Point aiLabelPos = {.x=titleLabel.textZone.x, .y=decrementBtn.rect.y+ decrementBtn.rect.h + 16}; + TextLabel aiLabel = createTextLabel( + "IA", + &aiLabelPos, + 1, + &white, + font, + renderer, + POSX_LEFT, + POSY_TOP + ); + + SDL_Point colorLabelPos = { + .x=incrementBtn.rect.x+incrementBtn.rect.w, + decrementBtn.rect.y+ decrementBtn.rect.h + 16 + }; + TextLabel colorLabel = createTextLabel( + "Couleur", + &colorLabelPos, + 1, + &white, + font, + renderer, + POSX_RIGHT, + POSY_TOP + ); + + SDL_Point pseudoLabelPos = { + .x= (titleLabel.textZone.x+ + aiLabel.textZone.w+ + colorLabelPos.x) + /2, + .y=decrementBtn.rect.y+ decrementBtn.rect.h + 16 + }; + TextLabel pseudoLabel = createTextLabel( + "Pseudonyme", + &pseudoLabelPos, + 1, + &white, + font, + renderer, + POSX_CENTER, + POSY_TOP + ); + + + 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}; + 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}; + incrementBtn.arg = &iparams; + + buttons[0] = decrementBtn; + buttons[1] = incrementBtn; + + InputProcessor inputProcessor = createInputProcessor(); + array_P_Button_AddElement(&inputProcessor.tabButton, incrementBtn); + array_P_Button_AddElement(&inputProcessor.tabButton, decrementBtn); + + while(*generalState == GS_GameCreationMenu) + { + printf("%d\n", nbPlayers); + SDL_SetRenderDrawColor(renderer, 55, 120, 175, 255); + SDL_RenderClear(renderer); + InputElement inputElement; + while (InputType_None != (inputElement = proccessInput(&inputProcessor)).type) + { + switch (inputElement.type) + { + case InputType_ActivateUI: + switch (inputElement.data.uiAction) + { + case UIAction_Quit: + *generalState = GS_MainMenu; + break; + case UIAction_Validate: + break; + case UIAction_Cancel: + break; + default: + break; + } + break; + case InputType_MoveGame: + + break; + case InputType_ClickGame: + + break; + case InputType_None: + default: + break; + } + } + nbPlayerLabel.text[0] = nbPlayers+48; + drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, nbPlayers); + SDL_RenderPresent(renderer); + SDL_Delay(25); + } + + + + //free - freeTextLabel(&nbJoueurLabel); + freeInputProcessor(&inputProcessor); + freeTextLabel(&titleLabel); freeButton(&incrementBtn); - + freeButton(&decrementBtn); return true; } diff --git a/Pontu/test/testCreationMenu.c b/Pontu/test/testCreationMenu.c index 4d907dc..ab82e9f 100644 --- a/Pontu/test/testCreationMenu.c +++ b/Pontu/test/testCreationMenu.c @@ -13,6 +13,7 @@ int testCreationMenu(void) { char* path = "rsrc/img/Lenna.png"; int i=0; int w, h; + int nbPlayer=1; if(0 != SDL_Init(SDL_INIT_VIDEO)) { fprintf(stderr, "Erreur SDL_INIT: %s\n", SDL_GetError()); @@ -42,7 +43,7 @@ int testCreationMenu(void) { goto Quit; } - if(0 != SDL_SetRenderDrawColor(renderer, 0,0,0,0)) //choisi la couleur avec laquelle travailler + if(0 != SDL_SetRenderDrawColor(renderer, 55,120,175,0)) //choisi la couleur avec laquelle travailler { fprintf(stderr, "Erreur SDL_SetRenderDrawColor: %s\n", SDL_GetError()); goto Quit; @@ -61,30 +62,12 @@ int testCreationMenu(void) { } - SDL_bool quit = SDL_FALSE; - SDL_Event event; - FontHandler fontHandler = loadFonts(); SDL_GetWindowSize(window, &w, &h); - while(!quit) - { - while(SDL_PollEvent(&event)) - { - switch(event.type) - { - case SDL_QUIT: - quit = SDL_TRUE; - break; - case SDL_MOUSEBUTTONUP: - break; - } - } - drawGameCreationMenu(renderer, fontHandler.fonts[FONT_retro], w, h); - SDL_RenderPresent(renderer); - - SDL_Delay(20); - } + GeneralState generalState = GS_GameCreationMenu; + printf("%d/%d\n", w, h); + gameCreationMenu(renderer, &generalState, fontHandler.fonts[FONT_retro], w, h); Quit: freeFonts(fontHandler);