From 088f4011287d89e7c506b218e455d5bbecf1e94a Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 12 Jan 2023 00:23:58 +0100 Subject: [PATCH] Selectable Elements working --- Makefile | 5 +- Ui/selectable.c | 82 ++++++++++++++++++++++ Ui/selectable.h | 42 +++++++++++ Ui/uiContainer.c | 58 ++++++++++++++- Ui/uiContainer.h | 3 + assets/selectable.png | Bin 0 -> 25704 bytes assets/selectable_background.png | Bin 0 -> 761 bytes assets/selectable_background_hovered.png | Bin 0 -> 762 bytes assets/selectable_background_selected.png | Bin 0 -> 761 bytes main.c | 5 ++ 10 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 Ui/selectable.c create mode 100644 Ui/selectable.h create mode 100644 assets/selectable.png create mode 100644 assets/selectable_background.png create mode 100644 assets/selectable_background_hovered.png create mode 100644 assets/selectable_background_selected.png diff --git a/Makefile b/Makefile index 2cd745e..c687b41 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CC = gcc FLAGS = -lraylib -lGL -lm -lpthread -ldl -lrt -lX11 -OBJS = main.o sprite.o inputHandler.o isometricMap.o game.o textureatlas.o animation.o animationHandler.o button.o uiContainer.o debug.o mapobject.o entity.o +OBJS = main.o sprite.o inputHandler.o isometricMap.o game.o textureatlas.o animation.o animationHandler.o button.o uiContainer.o debug.o mapobject.o entity.o selectable.o spiel: $(OBJS) $(CC) -o spiel $(OBJS) $(FLAGS) @@ -44,5 +44,8 @@ entity.o: Entity/entity.c mapobject.o: MapObject/mapobject.c $(CC) -c MapObject/mapobject.c $(FLAGS) +selectable.o: Ui/selectable.c + $(CC) -c Ui/selectable.c $(FLAGS) + clean: rm *.o spiel diff --git a/Ui/selectable.c b/Ui/selectable.c new file mode 100644 index 0000000..c8f93d6 --- /dev/null +++ b/Ui/selectable.c @@ -0,0 +1,82 @@ +#include "selectable.h" +#include +#include +#include + +Selectable * SelectableInit(Texture2D textures[3], Texture2D backgroundTextures[3], int hasBackground, Vector2 *position, char *description, int showDescripton, int descriptionLEN, int fontSize, int id){ + Selectable *selectable = malloc(sizeof(Selectable)); + + selectable->texture[0] = textures[0]; + selectable->texture[1] = textures[1]; + selectable->texture[2] = textures[2]; + selectable->hasBackground = hasBackground; + if(selectable->hasBackground == 1){ + selectable->backgroundTexture[0] = backgroundTextures[0]; + selectable->backgroundTexture[1] = backgroundTextures[1]; + selectable->backgroundTexture[2] = backgroundTextures[2]; + } + //else{ + // selectable->backgroundTexture[0] = 0; + // selectable->backgroundTexture[1] = 0; + // selectable->backgroundTexture[2] = 0; + //} + selectable->position.x = position->x; + selectable->position.y = position->y; + strncpy(selectable->description, description, descriptionLEN); + selectable->showDescription = showDescripton; + selectable->fontSize = fontSize; + selectable->id = id; + selectable->state = 0; + + return selectable; +} + + // TODO: Variable die den Maus Input freigibt solange nichts mit der Maus gemacht wurde + // Sobald ein Button gedrückt wurde in diesem Frame oder rect gezogen wird oder so ist sind Maus Funktionen gesperrt + // verhindert Spawnen von entities wenn man UI Elemente Drückt etc +void SelectableExecuteSelectable(Selectable *selectable, Game * game){ + // reset state after executing? + //selectable->state = SELECTABLE_STATE_DEFAULT; + switch(selectable->id){ + case SELECTABLE_ID_TEST: // Test Case Platzhalter + //printf("SELECTED\n"); + break; + default: + printf("\n\n\n\n\n\n Unsupported SELECTABLE ID %d \n\n\n\n\n\n", selectable->id); + break; + } +} + +int SelectableUpdateSelectableState(Selectable * selectable){ + if(selectable->state == SELECTABLE_STATE_SELECTED){ + if(IsMouseButtonDown(MOUSE_BUTTON_RIGHT)){ + return selectable->state = SELECTABLE_STATE_DEFAULT; + } + return SELECTABLE_STATE_SELECTED; + } + if(GetMouseX() > selectable->position.x && + GetMouseX() < selectable->position.x + selectable->backgroundTexture[selectable->state].width && + GetMouseY() > selectable->position.y && + GetMouseY() < selectable->position.y + selectable->backgroundTexture[selectable->state].height + ){ + if(IsMouseButtonDown(MOUSE_BUTTON_LEFT)){ + return selectable->state = SELECTABLE_STATE_SELECTED; + } + return selectable->state = SELECTABLE_STATE_HOVERED; + } + return selectable->state = SELECTABLE_STATE_DEFAULT; +} + +int SelectableUnselectSelectable(Selectable * selectable){ + selectable->state = SELECTABLE_STATE_DEFAULT; +} + +void SelectableDrawSelectable(Selectable * selectable){ + if(selectable->hasBackground) { + DrawTexture(selectable->backgroundTexture[selectable->state], selectable->position.x, selectable->position.y, WHITE); + } + DrawTexture(selectable->texture[selectable->state], selectable->position.x, selectable->position.y, WHITE); + if(selectable->showDescription == 1){ + DrawText(selectable->description, selectable->position.x, selectable->position.y, selectable->fontSize, WHITE); + } +} diff --git a/Ui/selectable.h b/Ui/selectable.h new file mode 100644 index 0000000..947a137 --- /dev/null +++ b/Ui/selectable.h @@ -0,0 +1,42 @@ +#ifndef SELECTABLE_H_ +#define SELECTABLE_H_ + +#include "raylib.h" +#include "../game.h" + +typedef struct Selectable Selctable; + +#define SELECTABLE_STATE_DEFAULT 0 +#define SELECTABLE_STATE_HOVERED 1 +#define SELECTABLE_STATE_SELECTED 2 + +#define SELECTABLE_ID_TEST 0 + +typedef struct Selectable{ + Vector2 position; // Linke obere Ecke + Vector2 centerPosition; // Die Mitte des Selectables + Texture2D texture[3];// [0]: Normal | [1]: Hovered | [2]: Selected + Texture2D backgroundTexture[3]; // [0]: Normal | [1]: Hovered | [2]: Selected + int hasBackground; // 0: hat keine Background Textur | 1: hat Background Textur + char description[20]; //Text der unter dem selectable angezeigt werden kann + int showDescription; //0: zeigt Description nicht | 1: zeigt Description + int id; // Durch die ID wird dem Selectable eine Funktion zugeordnet + int state; // 0: not selected | 1: hovered | 2: selected + int fontSize; // FontSize kann für jede Selectable Description individuell festgelegt werden +}Selectable; + +// Textures+backgroundTextures: [0]: Normal | [1]: Hovered | [2]: Selected +// hasBackground: 0: hat keine Background Textur | 1: hat Background Textur +// showDescription 0: zeigt Description nicht | 1: zeigt Description +// Max Description LEN 20 +Selectable * SelectableInit(Texture2D textures[3], Texture2D backgroundTextures[3], int hasBackground, Vector2 *position, char *description, int showDescripton, int descriptionLEN, int fontSize, int id); + +void SelectableExecuteSelectable(Selectable *selectable, Game * game); + +int SelectableUpdateSelectableState(Selectable * selectable); + +int SelectableUnselectSelectable(Selectable * selectable); + +void SelectableDrawSelectable(Selectable * selectable); + +#endif \ No newline at end of file diff --git a/Ui/uiContainer.c b/Ui/uiContainer.c index 2bd3527..de0e091 100644 --- a/Ui/uiContainer.c +++ b/Ui/uiContainer.c @@ -5,6 +5,7 @@ #include "stdlib.h" #include "stdio.h" + UiContainer * UiContainerInitPauseUiContainer(){ UiContainer *uiContainer = malloc(sizeof(UiContainer)); @@ -54,8 +55,43 @@ UiContainer * UiContainerInitMainMenuUiContainer(){ } UiContainer * UiContainerInitGameUiContainer(){ - printf("\n\n\n\n UiContainerInitGameUiContainer not implemented yet!! \n\n\n\n"); - return 0; + UiContainer *uiContainer = malloc(sizeof(UiContainer)); + + uiContainer->buttonCounter = 0; + + Texture2D textures[3] = { LoadTexture("assets/selectable.png"), //DEFAULT + LoadTexture("assets/selectable.png"), //HOVERED + LoadTexture("assets/selectable.png") //SELECTED + }; + + Texture2D backgroundTextures[3] = { LoadTexture("assets/selectable_background.png"), //DEFAULT + LoadTexture("assets/selectable_background_hovered.png"), //HOVERED + LoadTexture("assets/selectable_background_selected.png") //SELECTED + }; + Vector2 position = (Vector2){50, 250}; + int showDescription = 0; + Selectable *selectable1 = SelectableInit(textures, backgroundTextures, 1, &position, "Building", showDescription, 9, 16, SELECTABLE_ID_TEST); + position.y += 100; + Selectable *selectable2 = SelectableInit(textures, backgroundTextures, 1,&position, "Building2", showDescription, 10, 16, SELECTABLE_ID_TEST); + position.y += 100; + Selectable *selectable3 = SelectableInit(textures, backgroundTextures, 1,&position, "Building3", showDescription, 10, 16, SELECTABLE_ID_TEST); + position.y += 100; + Selectable *selectable4 = SelectableInit(textures, backgroundTextures, 1,&position, "Building4", showDescription, 10, 16, SELECTABLE_ID_TEST); + position.x += 100; + Selectable *selectable5 = SelectableInit(textures, backgroundTextures, 1,&position, "Building5", showDescription, 10, 16, SELECTABLE_ID_TEST); + position.x += 100; + Selectable *selectable6 = SelectableInit(textures, backgroundTextures, 1,&position, "Building6", showDescription, 10, 16, SELECTABLE_ID_TEST); + + uiContainer->selectables[0] = selectable1; + uiContainer->selectables[1] = selectable2; + uiContainer->selectables[2] = selectable3; + uiContainer->selectables[3] = selectable4; + uiContainer->selectables[4] = selectable5; + uiContainer->selectables[5] = selectable6; + + uiContainer->selectableCounter = 6; + + return uiContainer; } // Updated alle Buttons und führt gegebenenfalls deren Code aus @@ -67,6 +103,21 @@ void UiContainerUpdateUiContainer(UiContainer *uiContainer, Game *game){ ButtonExecuteButton(uiContainer->buttons[i], game); } } + for(i=0 ; i < uiContainer->selectableCounter; i++){ + int setState = SelectableUpdateSelectableState(uiContainer->selectables[i]); + // Unselecting every selectable if one is selected + if(setState == SELECTABLE_STATE_SELECTED){ + int j; + for(j=0 ; j < uiContainer->selectableCounter; j++){ + if(i != j){ + SelectableUnselectSelectable(uiContainer->selectables[j]); + } + } + } + if(uiContainer->selectables[i]->state == SELECTABLE_STATE_SELECTED){ + SelectableExecuteSelectable(uiContainer->selectables[i], game); + } + } } // Drawed alle Buttons @@ -75,4 +126,7 @@ void UiContainerDrawUiContainer(UiContainer *uiContainer){ for(i=0 ; i < uiContainer->buttonCounter; i++){ ButtonDrawButton(uiContainer->buttons[i]); } + for(i=0 ; i < uiContainer->selectableCounter; i++){ + SelectableDrawSelectable(uiContainer->selectables[i]); + } } \ No newline at end of file diff --git a/Ui/uiContainer.h b/Ui/uiContainer.h index fa85d1b..2c2ae90 100644 --- a/Ui/uiContainer.h +++ b/Ui/uiContainer.h @@ -3,11 +3,14 @@ #include "raylib.h" #include "button.h" +#include "selectable.h" #include "../game.h" typedef struct UiContainer{ Button *buttons[15]; // Platz für max. 15 Buttons int buttonCounter; // Zeigt wie viele Buttons der UiContainer aktuell schon speichert + Selectable *selectables[20]; // Platz für max 20 Selectables + int selectableCounter; // Zeigt wie viele Selectables der UiContainer aktuell schon speichert } UiContainer; void UiContainerUpdateUiContainer(UiContainer *uiContainer, Game *game); diff --git a/assets/selectable.png b/assets/selectable.png new file mode 100644 index 0000000000000000000000000000000000000000..83269ed0c3bb67575d4f138c57fb04a3c7715163 GIT binary patch literal 25704 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, game->camera); + // Button / UI stuff + UiContainerUpdateUiContainer(gameScreenUiContainer, game); + UiContainerDrawUiContainer(gameScreenUiContainer); + if(IsKeyPressed(KEY_P)){ game->screen = SCREEN_PAUSE; }