new enum for button, drawn become enable

origin/fixingSettings
Mathis RIBEMONT 3 years ago
parent ef51abf562
commit f1ac5006f0

@ -11,7 +11,7 @@
int main(int argc, char *argv[]) {
SDL_Rect windowSize = {10, 10, 900, 900};
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
@ -48,6 +48,7 @@ int main(int argc, char *argv[]) {
switch (generalState) {
case GS_MainMenu:
mainMenu(renderer,window,&generalState, fontHandler, audioHandler);
playSFX(validate_sound, audioHandler)
break;
case GS_GameCreationMenu:{
int windowW;
@ -73,7 +74,7 @@ int main(int argc, char *argv[]) {
generalState = GS_Game;
gameView(&generalState, window, renderer, players, nbPlayers, &fontHandler);
//Pour tester le endGameMenu directement
/*generalState = GS_EndOfGameMenu;
players[0].eliminationTurn = 10;

@ -32,7 +32,8 @@
*/
#define MACRO_FOR_ALL_SFX(M) \
M(testClick) \
M(menu_sound_effect)
M(menu_sound_effect) \
M(validate_sound)
/**
* Macro used to generate the entries for the musics in #EnumAudios.

@ -13,6 +13,8 @@
struct P_buttonArg;
enum {BUTTON_NOTHING, BUTTON_ENTRY, BUTTON_EXIT};
/**
* \struct P_Button
* \brief Represents a button
@ -23,7 +25,7 @@ typedef struct P_button
SDL_Texture* hoverTexture; ///> texture to draw when the button is hovered
SDL_Rect rect; ///> defines coordinates and size for hitbox and display
void (*onClick)(struct P_button* buttonCaller); ///> action done on click
bool drawn; ///> is the button drawn
bool enable; ///> is the button enable and drawable
bool hover; ///> is the button hovered
void* arg;
} P_Button;

Binary file not shown.

@ -6,7 +6,7 @@
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, .drawn = false};
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");
b.texture = texture;
@ -18,19 +18,20 @@ 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)))
{
fprintf(stderr,"SDLWarning: %s\n",SDL_GetError());
return false;
}
button->drawn = true;
//printf("Redraw de %p\n",button);
return true;
}
bool isHover(P_Button* button)
{
return button->hover && button->drawn;
return button->hover && button->enable;
}
bool changeButtonTexture(P_Button* button, SDL_Texture* texture)
@ -65,12 +66,12 @@ int isButtonInteractWithCursor(P_Button * button,const int x,const int y){
if(isHover(button)){
button->hover = SDL_PointInRect(&coord,&(button->rect));
if(button->hover == false){
return 2;
return BUTTON_EXIT;
}
return 0;
return BUTTON_NOTHING;
}
button->hover = SDL_PointInRect(&coord,&(button->rect));
if(button->hover)
return 1;
return 0;
return BUTTON_ENTRY;
return BUTTON_NOTHING;
}

@ -114,32 +114,16 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general
}
break;
case SDL_MOUSEMOTION:
switch (isButtonInteractWithCursor(&(buttons[0]),event.motion.x,event.motion.y)) {
case 1:
drawButtonOnRenderer(renderer,&(buttons[0]));
playSFX(SFX_menu_sound_effect, audioHandler);
break;
case 2:
drawButtonOnRenderer(renderer,&(buttons[0]));
break;
}
switch (isButtonInteractWithCursor(&(buttons[1]),event.motion.x,event.motion.y)) {
case 1:
drawButtonOnRenderer(renderer,&(buttons[1]));
playSFX(SFX_menu_sound_effect, audioHandler);
break;
case 2:
drawButtonOnRenderer(renderer,&(buttons[1]));
break;
}
switch (isButtonInteractWithCursor(&(buttons[2]),event.motion.x,event.motion.y)) {
case 1:
drawButtonOnRenderer(renderer,&(buttons[2]));
playSFX(SFX_menu_sound_effect, audioHandler);
break;
case 2:
drawButtonOnRenderer(renderer,&(buttons[2]));
break;
for (size_t i = 0; i < nb; i++) {
switch (isButtonInteractWithCursor(&(buttons[i]),event.motion.x,event.motion.y)) {
case 1:
drawButtonOnRenderer(renderer,&(buttons[i]));
playSFX(SFX_menu_sound_effect, audioHandler);
break;
case 2:
drawButtonOnRenderer(renderer,&(buttons[i]));
break;
}
}
break;
case SDL_WINDOWEVENT:
@ -152,9 +136,10 @@ int mainMenu(SDL_Renderer * renderer,SDL_Window * window, GeneralState * general
event.window.data2);
windowSize.w = event.window.data1;
windowSize.h = event.window.data2;
buttons[0].rect.x = (windowSize.w/2)-(buttons[0].rect.w/2);
buttons[1].rect.x = (windowSize.w/2)-(buttons[1].rect.w/2);
buttons[2].rect.x = (windowSize.w/2)-(buttons[2].rect.w/2);
for (size_t i = 0; i < nb; i++) {
buttons[i].rect.x = (windowSize.w/2)-(buttons[i].rect.w/2);
drawButtonOnRenderer(renderer,&(buttons[i]));
}
}
break;
default:

@ -16,7 +16,7 @@ struct endGameMenuTextLabel {
/**
* @brief Button handle which set a generalState to GS_MainMenu
*
*
* @param caller The button clicked
*/
void setStateToMainMenu(P_Button* caller) {
@ -29,9 +29,9 @@ SDL_Rect getEndGameMenuRect(SDL_Window* window) {
SDL_GetWindowSize(window, &windowW, &windowH);
SDL_Rect rect = {
.x=windowW/10,
.y=0,
.w=windowW*80/100,
.x=windowW/10,
.y=0,
.w=windowW*80/100,
.h=windowH
};
return rect;
@ -39,17 +39,17 @@ SDL_Rect getEndGameMenuRect(SDL_Window* window) {
/**
* @brief Create button For EndGameMenu
*
* @param renderer The renderer where buttons will be drawn
*
* @param renderer The renderer where buttons will be enable
* @param font Font used by buttons
* @param rect Rect in which the endGameMenu is drawn
* @param state generalState which will be attached to the button
* @return P_Button
* @param rect Rect in which the endGameMenu is enable
* @param state generalState which will be attached to the button
* @return P_Button
*/
P_Button createButtonForEndGameMenu(SDL_Renderer* renderer, TTF_Font* font, const SDL_Rect* rect, GeneralState* state) {
int sizeX;
int sizeY;
SDL_Texture* texture = createGenericButtonTexture("Retour menu", font, 50, COLOR_GENERIC_BUTTON_BORDER, COLOR_GENERIC_BUTTON_BACKGROUND, 4, 4, &sizeX, &sizeY, renderer);
if (texture == NULL) {
perror(SDL_GetError());
@ -60,7 +60,7 @@ P_Button createButtonForEndGameMenu(SDL_Renderer* renderer, TTF_Font* font, cons
perror(SDL_GetError());
exit(errno);
}
P_Button buttonMenuEndGame = createButton(texture, textureHover, rect->x, rect->y, sizeX, sizeY, &setStateToMainMenu);
buttonMenuEndGame.arg = state;
@ -85,7 +85,7 @@ TextLabel createEliminationTurnLabel(SDL_Renderer* renderer, TTF_Font* font, con
sprintf(text, "Tour: %d", eliminationTurn);
TextLabel label = createUnsizedTextLabel(text, color, font, renderer);
free(text);
return label;
@ -150,7 +150,7 @@ struct endGameMenuTextLabel createLabels(SDL_Renderer* renderer, const Player pl
for (size_t i=0; i<nbPlayers; ++i) {
array_TextLabel_AddElement(&labels.textLabels, createPseudoAndRankLabel(renderer, fontHandler->fonts[FONT_retro], &PLAYER_SDL_COLORS[players[i].color], players[i].rank, players[i].pseudo));
array_PositionSpecifier_AddElement(&labels.positionSpecifiers, getPseudoAndRankPositionSpecifier(&array_TextLabel_Last(&labels.textLabels)->textZone, players[i].rank));
array_TextLabel_AddElement(&labels.textLabels, createEliminationTurnLabel(renderer, fontHandler->fonts[FONT_retro], &PLAYER_SDL_COLORS[players[i].color], players[i].eliminationTurn));
array_PositionSpecifier_AddElement(&labels.positionSpecifiers, getEliminationTurnPositionSpecifier(&array_TextLabel_Last(&labels.textLabels)->textZone, players[i].rank));
}
@ -159,10 +159,10 @@ struct endGameMenuTextLabel createLabels(SDL_Renderer* renderer, const Player pl
void drawEndGameMenu(SDL_Renderer* renderer, const SDL_Rect rectMenuEndGame, struct endGameMenuTextLabel* labels) {
SDL_SetRenderDrawColor(renderer, 220,220,220,255);
SDL_RenderFillRect(renderer, &rectMenuEndGame);
for (size_t i=0; i<labels->textLabels.size; ++i) {
labels->textLabels.elems[i].textZone = adaptPosToRect(&labels->positionSpecifiers.elems[i], &rectMenuEndGame);
drawTextLabel(renderer, &labels->textLabels.elems[i]);
@ -184,10 +184,10 @@ 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->drawn = false;
buttonMenuEndGame->enable = false;
struct endGameMenuTextLabel labels = createLabels(renderer, players, nbPlayers, fontHandler);
drawEndGameMenu(renderer, endGameMenuRect, &labels);
while(*generalState == GS_EndOfGameMenu)
@ -213,36 +213,36 @@ void endGameMenu(GeneralState* generalState, SDL_Window* window, SDL_Renderer* r
}
break;
case InputType_Window_Resize: {
const SDL_Rect rectM = {
.x=inputElement.data.windowSize.w/10,
.y=0,
.w=inputElement.data.windowSize.w*80/100,
.x=inputElement.data.windowSize.w/10,
.y=0,
.w=inputElement.data.windowSize.w*80/100,
.h=inputElement.data.windowSize.h
};
drawEndGameMenu(renderer, rectM, &labels);
buttonMenuEndGame->rect = adaptPosToRect(&positionSpecifierButtonRetour, &rectM);
buttonMenuEndGame->drawn = false;
buttonMenuEndGame->enable = false;
fprintf(stderr, "Resize\n"); fflush(stderr);
}
}
default:
break;
}
}
}
if (!buttonMenuEndGame->drawn) {
if (!buttonMenuEndGame->enable) {
drawButtonOnRenderer(renderer, buttonMenuEndGame);
SDL_RenderPresent(renderer);
}
SDL_Delay(50);
}
freeInputProcessor(&inputProcessor);
for (size_t i=0; i<labels.textLabels.size; ++i) {
freeTextLabel(&labels.textLabels.elems[i]);
}

Loading…
Cancel
Save