Commented GameCreationMenu & optimized createPlayerLines

createPlayerLines created its own array of players w/ memory leak because its address was passed in a function
maribemont/settings^2
thmaillarb 3 years ago
parent 3e273e4fa3
commit 7c925e3740

3
.gitignore vendored

@ -97,3 +97,6 @@ Documentation/doxygen/
# .idea since only 1 person uses CLion # .idea since only 1 person uses CLion
Pontu/.idea/ Pontu/.idea/
*.swp

@ -10,6 +10,7 @@
#include "engine/Colors.h" #include "engine/Colors.h"
#include "model/Player.h" #include "model/Player.h"
#include "engine/TextInput.h" #include "engine/TextInput.h"
#include "engine/AudioHandler.h"
#define NB_COLORS 4 #define NB_COLORS 4
#define NB_PLAYER_MAX 4 #define NB_PLAYER_MAX 4
@ -48,6 +49,8 @@ typedef struct
CreateMenuLine* lines; CreateMenuLine* lines;
SDL_Renderer* renderer; SDL_Renderer* renderer;
SDL_Color* bg; SDL_Color* bg;
InputProcessor* inproc;
Player players[4];
}IncrementParams; }IncrementParams;
typedef struct typedef struct
@ -60,4 +63,4 @@ typedef struct
TTF_Font* font; TTF_Font* font;
}DecrementParams; }DecrementParams;
bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState, TTF_Font* font, int width, int height, Player players[], int* nbPlayers); bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState, AudioHandler* ah, TTF_Font* font, int width, int height, Player players[], int* nbPlayers);

@ -3,8 +3,8 @@
#include <SDL2/SDL_ttf.h> #include <SDL2/SDL_ttf.h>
void freeCreateMenuLine(CreateMenuLine* line); void freeCreateMenuLine(CreateMenuLine* line);
CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int xmax, TTF_Font* font, Player* player); CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int xmax, TTF_Font* font, Player* player, InputProcessor* inproc);
void createPlayersLines(SDL_Renderer* renderer, TTF_Font* font, int minx, int maxx, int miny,int nbPlayer, CreateMenuLine* lines); void createPlayersLines(SDL_Renderer* renderer, TTF_Font* font, int minx, int maxx, int miny,int nbPlayer, CreateMenuLine* lines, InputProcessor* inproc, Player players[]);
bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabels, P_Button* buttons, int nbButtons, CreateMenuLine* lines, int nbPlayer, const SDL_Color* bg); 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); bool drawCreateMenuLine(SDL_Renderer* renderer, CreateMenuLine* line);
void changePlayerColor(P_Button* caller); void changePlayerColor(P_Button* caller);
@ -24,7 +24,7 @@ void incrementNbPlayer(P_Button* caller)
return; return;
} }
createPlayersLines(params->renderer, params->font, params->minx, params->maxx, params->lines[*nbPlayers-1].h+params->lines[*nbPlayers-1].y, 1, &params->lines[*nbPlayers]); createPlayersLines(params->renderer, params->font, params->minx, params->maxx, params->lines[*nbPlayers-1].h+params->lines[*nbPlayers-1].y, 1, &params->lines[*nbPlayers], params->inproc, params->players);
drawCreateMenuLine(params->renderer, &params->lines[*nbPlayers]); drawCreateMenuLine(params->renderer, &params->lines[*nbPlayers]);
++(*nbPlayers); ++(*nbPlayers);
@ -64,14 +64,17 @@ void changePlayerColor(P_Button* caller)
{ {
ChangeColorParams* params = (ChangeColorParams*)caller->arg; ChangeColorParams* params = (ChangeColorParams*)caller->arg;
params->p->color = params->color; params->p->color = params->color;
printf("change color %d\n", params->p->color);
fflush(stdout);
} }
bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabels, P_Button* buttons, int nbButtons, CreateMenuLine* lines, int nbPlayer, const SDL_Color* bg) bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabels, P_Button* buttons, int nbButtons, CreateMenuLine* lines, int nbPlayer, const SDL_Color* bg)
{ {
//Draw everything //Draw background (blue-ish)
SDL_SetRenderDrawColor(renderer, bg->r, bg->g, bg->b, bg->a); SDL_SetRenderDrawColor(renderer, bg->r, bg->g, bg->b, bg->a);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
// Buttons
for(int i=0; i<nbButtons; ++i) for(int i=0; i<nbButtons; ++i)
{ {
if(!drawButtonOnRenderer(renderer, &(buttons[i]))) if(!drawButtonOnRenderer(renderer, &(buttons[i])))
@ -81,10 +84,12 @@ bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabe
} }
} }
// TextLabels
for(int i=0; i<nbLabels; ++i) for(int i=0; i<nbLabels; ++i)
{ {
drawTextLabel(renderer, labels[i]); drawTextLabel(renderer, labels[i]);
} }
// Menu lines (1 for each player)
for(int i=0; i<nbPlayer; ++i) for(int i=0; i<nbPlayer; ++i)
{ {
drawCreateMenuLine(renderer, &lines[i]); drawCreateMenuLine(renderer, &lines[i]);
@ -94,17 +99,17 @@ bool drawGameCreationMenu(SDL_Renderer* renderer, TextLabel** labels, int nbLabe
} }
void createPlayersLines(SDL_Renderer* renderer, TTF_Font* font, int minx, int maxx, int miny,int nbPlayer, CreateMenuLine* lines) void createPlayersLines(SDL_Renderer* renderer, TTF_Font* font, int minx, int maxx, int miny,int nbPlayer, CreateMenuLine* lines, InputProcessor* inproc, Player players[])
{ {
Player players[nbPlayer];
for(int i=0; i<nbPlayer; ++i) for(int i=0; i<nbPlayer; ++i)
{ {
if(i==0) if(i==0)
{ {
lines[i] = createCreateMenuLine(renderer, minx, miny + 16, maxx,font, &players[i]); // Position of first line is absolute
lines[i] = createCreateMenuLine(renderer, minx, miny + 16, maxx,font, &players[i], inproc);
}else{ }else{
lines[i] = createCreateMenuLine(renderer, minx, miny + 16 + 16 + i* lines[i-1].aiButton.rect.h, maxx,font, &players[i]); // Position of other lines is relative to the first one (16 px (margin) + nb_lines_already_drawn * height of AI checkbox)
lines[i] = createCreateMenuLine(renderer, minx, miny + 16 + 16 + i* lines[i-1].aiButton.rect.h, maxx,font, &players[i], inproc);
} }
} }
@ -113,16 +118,19 @@ void createPlayersLines(SDL_Renderer* renderer, TTF_Font* font, int minx, int ma
bool drawCreateMenuLine(SDL_Renderer* renderer, CreateMenuLine* line) bool drawCreateMenuLine(SDL_Renderer* renderer, CreateMenuLine* line)
{ {
// AI checkbox
drawButtonOnRenderer(renderer, &line->aiButton); drawButtonOnRenderer(renderer, &line->aiButton);
// Color chooser
for(int i=0; i<NB_COLORS; ++i) for(int i=0; i<NB_COLORS; ++i)
{ {
drawButtonOnRenderer(renderer, &line->colorButtons[i]); drawButtonOnRenderer(renderer, &line->colorButtons[i]);
} }
// TextInput
drawTextInputOnRenderer(renderer, &line->pseudoInput); drawTextInputOnRenderer(renderer, &line->pseudoInput);
return true; return true;
} }
CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int xmax, TTF_Font* font, Player* player) CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int xmax, TTF_Font* font, Player* player, InputProcessor* inproc)
{ {
int const wColorBtn = 32; int const wColorBtn = 32;
int const hColorBtn = 32; int const hColorBtn = 32;
@ -134,6 +142,7 @@ CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int
CreateMenuLine line = {.x=xmin, y}; CreateMenuLine line = {.x=xmin, y};
// AI checkbox
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* 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); SDL_Texture* aiTextureHovered = createGenericButtonTexture("X", font, 16, COLOR_GENERIC_BUTTON_BACKGROUND, COLOR_GENERIC_BUTTON_BACKGROUND, 4, 8, &ai.rect.w, &ai.rect.h, renderer);
line.h = ai.rect.h; line.h = ai.rect.h;
@ -142,9 +151,11 @@ CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int
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}; 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};
// Text input of nickname
TextInput pseudoInput; TextInput pseudoInput;
initTextInput(&pseudoInput, &rect, NULL, font); initTextInput(&pseudoInput, &rect, NULL, font);
// Color chooser
ChangeColorParams* params; ChangeColorParams* params;
for(int i=0; i<NB_COLORS; ++i) for(int i=0; i<NB_COLORS; ++i)
@ -158,8 +169,11 @@ CreateMenuLine createCreateMenuLine(SDL_Renderer* renderer, int xmin, int y, int
btnTextureHover = createGenericButtonTexture("", font, 0, COLOR_GENERIC_BUTTON_BACKGROUND, PLAYER_SDL_COLORS[i], 4, 8, NULL, NULL, renderer); btnTextureHover = createGenericButtonTexture("", font, 0, COLOR_GENERIC_BUTTON_BACKGROUND, PLAYER_SDL_COLORS[i], 4, 8, NULL, NULL, renderer);
colorsBtn[i].texture = btnTexture; colorsBtn[i].texture = btnTexture;
colorsBtn[i].hoverTexture = btnTextureHover; colorsBtn[i].hoverTexture = btnTextureHover;
array_P_Button_AddElement(&inproc->tabButton, colorsBtn[i]);
} }
// Filling struct
line.w = colorsBtn[0].rect.x + colorsBtn[0].rect.w; line.w = colorsBtn[0].rect.x + colorsBtn[0].rect.w;
line.aiButton=ai; line.aiButton=ai;
line.colorButtons=colorsBtn; line.colorButtons=colorsBtn;
@ -180,7 +194,7 @@ void freeCreateMenuLine(CreateMenuLine* line)
} }
} }
bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Font* font, int width, int height, Player players[], int* nbPlayers) bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState, AudioHandler* ah, TTF_Font* font, int width, int height, Player players[], int* nbPlayers)
{ {
*nbPlayers = 2; *nbPlayers = 2;
int const nbLabels = 5; int const nbLabels = 5;
@ -218,7 +232,6 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon
if(btnHoveredTexture == NULL) if(btnHoveredTexture == NULL)
{ {
fprintf(stderr, "WARNING: Can't create hover texture: %s\n", SDL_GetError()); fprintf(stderr, "WARNING: Can't create hover texture: %s\n", SDL_GetError());
return false;
} }
decrementBtn.texture = btnTexture; decrementBtn.texture = btnTexture;
decrementBtn.hoverTexture = btnHoveredTexture; decrementBtn.hoverTexture = btnHoveredTexture;
@ -260,12 +273,11 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon
if(btnHoveredTexture == NULL) if(btnHoveredTexture == NULL)
{ {
fprintf(stderr, "WARNING: Can't create hover texture: %s\n", SDL_GetError()); fprintf(stderr, "WARNING: Can't create hover texture: %s\n", SDL_GetError());
return false;
} }
incrementBtn.texture = btnTexture; incrementBtn.texture = btnTexture;
incrementBtn.hoverTexture = btnHoveredTexture; incrementBtn.hoverTexture = btnHoveredTexture;
// AI label
SDL_Point aiLabelPos = {.x=titleLabel.textZone.x, .y=decrementBtn.rect.y+ decrementBtn.rect.h + 16}; SDL_Point aiLabelPos = {.x=titleLabel.textZone.x, .y=decrementBtn.rect.y+ decrementBtn.rect.h + 16};
TextLabel aiLabel = createTextLabel( TextLabel aiLabel = createTextLabel(
"IA", "IA",
@ -278,6 +290,7 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon
POSY_TOP POSY_TOP
); );
// Color label
SDL_Point colorLabelPos = { SDL_Point colorLabelPos = {
.x=incrementBtn.rect.x+incrementBtn.rect.w, .x=incrementBtn.rect.x+incrementBtn.rect.w,
decrementBtn.rect.y+ decrementBtn.rect.h + 16 decrementBtn.rect.y+ decrementBtn.rect.h + 16
@ -293,6 +306,7 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon
POSY_TOP POSY_TOP
); );
// Pseudo input
SDL_Point pseudoLabelPos = { SDL_Point pseudoLabelPos = {
.x= (titleLabel.textZone.x+ .x= (titleLabel.textZone.x+
aiLabel.textZone.w+ aiLabel.textZone.w+
@ -312,26 +326,35 @@ 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);
// Filling TextLabel array
labels[0] = &titleLabel; labels[0] = &titleLabel;
labels[1] = &nbPlayerLabel; labels[1] = &nbPlayerLabel;
labels[2] = &aiLabel; labels[2] = &aiLabel;
labels[3] = &pseudoLabel; labels[3] = &pseudoLabel;
labels[4] = &colorLabel; labels[4] = &colorLabel;
// Initializing InputProcessor
InputProcessor inputProcessor = createInputProcessor();
// Creating 2 player lines (lines with a AI checkbox, a text input for the nickname, and a color chooser)
createPlayersLines(renderer, font, titleLabelPos.x, incrementBtn.rect.x+incrementBtn.rect.w, colorLabel.textZone.y+colorLabel.textZone.h , *nbPlayers, lines, &inputProcessor, players);
DecrementParams dparams= {.nbPlayers=nbPlayers, .lines=lines, .renderer=renderer, .bg = &bg, .nbPlayersLbl=&nbPlayerLabel, .font=font}; DecrementParams dparams= {.nbPlayers=nbPlayers, .lines=lines, .renderer=renderer, .bg = &bg, .nbPlayersLbl=&nbPlayerLabel, .font=font};
decrementBtn.arg = &dparams; 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, .inproc=&inputProcessor, .players = players};
incrementBtn.arg = &iparams; incrementBtn.arg = &iparams;
buttons[0] = decrementBtn; buttons[0] = decrementBtn;
buttons[1] = incrementBtn; buttons[1] = incrementBtn;
InputProcessor inputProcessor = createInputProcessor();
array_P_Button_AddElement(&inputProcessor.tabButton, incrementBtn); array_P_Button_AddElement(&inputProcessor.tabButton, incrementBtn);
array_P_Button_AddElement(&inputProcessor.tabButton, decrementBtn); array_P_Button_AddElement(&inputProcessor.tabButton, decrementBtn);
// Displaying menu
drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, *nbPlayers, &bg); drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, *nbPlayers, &bg);
while(*generalState == GS_GameCreationMenu) while(*generalState == GS_GameCreationMenu)
{ {
@ -358,7 +381,7 @@ bool gameCreationMenu(SDL_Renderer* renderer, GeneralState* generalState,TTF_Fon
{ {
if(inputElement.data.buttonEvent.button == &incrementBtn || inputElement.data.buttonEvent.button == &decrementBtn) if(inputElement.data.buttonEvent.button == &incrementBtn || inputElement.data.buttonEvent.button == &decrementBtn)
{ {
nbPlayerLabel.text[0] = *nbPlayers + 48; //nbPlayerLabel.text[0] = *nbPlayers + 48;
drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, *nbPlayers, &bg); drawGameCreationMenu(renderer, labels, nbLabels, buttons, nbButtons, lines, *nbPlayers, &bg);
} }

@ -67,7 +67,9 @@ int testCreationMenu(void) {
SDL_GetWindowSize(window, &w, &h); SDL_GetWindowSize(window, &w, &h);
GeneralState generalState = GS_GameCreationMenu; GeneralState generalState = GS_GameCreationMenu;
printf("%d/%d\n", w, h); printf("%d/%d\n", w, h);
gameCreationMenu(renderer, &generalState, fontHandler.fonts[FONT_retro], w, h); Player players[4];
int nbPlayers;
gameCreationMenu(renderer, &generalState, NULL, fontHandler.fonts[FONT_retro], w, h, players, &nbPlayers);
Quit: Quit:
freeFonts(fontHandler); freeFonts(fontHandler);

@ -115,4 +115,4 @@ void testTextInputProcessor() {
fprintf(stderr, "Texte tapé : %s\n", textInput->value); fprintf(stderr, "Texte tapé : %s\n", textInput->value);
freeInputProcessor(&inputProcessor); freeInputProcessor(&inputProcessor);
} }

Loading…
Cancel
Save