From 7fc443483615a6b809158402f17b91969d4c38b5 Mon Sep 17 00:00:00 2001 From: JanEhehalt Date: Wed, 23 Nov 2022 22:28:25 +0100 Subject: [PATCH] IsometricMap Layers added, currently Array, might be List in the future && Selecting tiles from every layer possible --- Input/inputHandler.c | 30 ++++++++++++++++++++------ Input/inputHandler.h | 2 +- IsometricMap/isometricMap.c | 37 +++++++++++++++++++++++--------- IsometricMap/isometricMap.h | 4 +++- IsometricMap/isometricRenderer.c | 29 ++++++++++++++----------- IsometricMap/isometricRenderer.h | 2 +- README.md | 4 +--- main.c | 33 +++++++++++++++++----------- 8 files changed, 94 insertions(+), 47 deletions(-) diff --git a/Input/inputHandler.c b/Input/inputHandler.c index a2317ca..1618af9 100644 --- a/Input/inputHandler.c +++ b/Input/inputHandler.c @@ -6,6 +6,7 @@ #include #include #include "../List/list.h" +#include "../IsometricMap/tile.h" //TODO: Macht es Sinn ein einzelnes "Game" struct zu haben, das alle möglichen Pointer hat zu allen arrays, camera, textures etc? // Man hat einen Übergabeparameter mit dem man dann alles verändern kann, man muss nicht alles was man verändern will einzeln übergeben @@ -53,17 +54,34 @@ Vector2 GetRectangle(Vector2 rectStart){ return rectStart; } -void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap *map){ +void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap **layers){ inputHandler->cursorPos.x = GetMousePosition().x; inputHandler->cursorPos.y = GetMousePosition().y; // resetting last selected Tile to grass texture - IsometricMapChangeTextureIdOfTile(map, (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 0); - // updating selected tile - IsometricMapProject(map, camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->selectedTile); - // setting currently selected tile to tower - IsometricMapChangeTextureIdOfTile(map, (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 1); + int n = 9; + if(inputHandler->selectedLayer != -1){ + IsometricMapChangeTextureIdOfTile(layers[inputHandler->selectedLayer], (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 0); + } + for(n = 2; n >= 0 ; n--){ + if(layers[n] != 0){ + + IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->selectedTile); + + Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(layers[n], inputHandler->selectedTile.x, inputHandler->selectedTile.y); + + if(selectedTile != 0){ + //printf("ALARM bei n = %d \n", n); + inputHandler->selectedTile.x = selectedTile->x; + inputHandler->selectedTile.y = selectedTile->y; + // setting currently selected tile to tower + inputHandler->selectedLayer = n; + IsometricMapChangeTextureIdOfTile(layers[n], (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 1); + break; + } + } + } if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){ diff --git a/Input/inputHandler.h b/Input/inputHandler.h index 9a08585..aa82b38 100644 --- a/Input/inputHandler.h +++ b/Input/inputHandler.h @@ -13,7 +13,7 @@ typedef struct InputHandler{ int selectedLayer; } InputHandler; -void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap *map); +void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap **layers); void keyboardInput(InputHandler *inputHandler, Camera2D *camera); diff --git a/IsometricMap/isometricMap.c b/IsometricMap/isometricMap.c index a9d4469..839f8e9 100644 --- a/IsometricMap/isometricMap.c +++ b/IsometricMap/isometricMap.c @@ -14,6 +14,8 @@ IsometricMap * IsometricMapInit(int x, int y, int layer){ map->originY = -layer * map->tileTextures[0].width / 4; map->width = x * map->tileTextures[0].width; map->height = y * map->tileTextures[0].height; + map->widthBounds = 100; + map->heightBounds = 100; Tile*** tiles = (Tile***)malloc(x*sizeof(Tile*)); int n = 0; @@ -59,13 +61,13 @@ Tile * IsometricMapGetTileFromArrayPosition(IsometricMap *map, int x, int y){ return map->tiles[x][y]; } -void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, int y, Vector2 *tmp){ +void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x, float y, Vector2 *tmp){ int mouseAdjustmentX = -8; int mouseAdjustmentY = -4; float tileWidthHalf = isometricMap->tileTextures[0].width / 2; - float tileHeightHalf = isometricMap->tileTextures[0].height / 4; + float tileHeightQuarter = isometricMap->tileTextures[0].height / 4; x += camera->target.x + mouseAdjustmentX; y += camera->target.y + mouseAdjustmentY; @@ -74,19 +76,34 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, in float yPos = (float) y; - int isoX = 0.5 * ( xPos / tileWidthHalf + yPos / tileHeightHalf); - int isoY = 0.5 * ( -xPos / tileWidthHalf + yPos / tileHeightHalf); + float isoX = 0.5 * ( xPos / tileWidthHalf + yPos / tileHeightQuarter); + float isoY = 0.5 * ( -xPos / tileWidthHalf + yPos / tileHeightQuarter); + tmp->x = isoX * isometricMap->tileTextures[0].width; + tmp->y = isoY * isometricMap->tileTextures[0].height; +} + +Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float x, float y){ + + x = (int)(x / isometricMap->tileTextures->width); + y = (int)(y / isometricMap->tileTextures->height); - //Vector2 tmp = {isoX * tileWidthHalf * 2, isoY * tileHeightHalf * 2}; - //Vector2* tmp = (Vector2 *) malloc(sizeof(Vector2)); - tmp->x = isoX; - tmp->y = isoY; + Tile *ptr = (Tile *) malloc(sizeof(Tile *)); + ptr->x = 0; + ptr->y = 0; - //return tmp; + if( x < isometricMap->sizeX && y < isometricMap->sizeY && + x >= 0 && y >= 0 ){ + ptr->x = isometricMap->tiles[(int)x][(int)y]->x; + ptr->y = isometricMap->tiles[(int)x][(int)y]->y; + return ptr; + } + ptr = 0; + return ptr; } + void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId){ //if(x < isometricMap->sizeX && y < isometricMap->sizeY){ @@ -105,7 +122,7 @@ void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId void IsometricMapChangeTextureIdOfTile(IsometricMap *map, int x, int y, int id){ if( x < map->sizeX && y < map->sizeY && - x > map->originX && y > map->originY ){ + x >= 0 && y >= 0 ){ (map->tiles[x][y])->textureId = id; } } diff --git a/IsometricMap/isometricMap.h b/IsometricMap/isometricMap.h index 638ec85..1c08503 100644 --- a/IsometricMap/isometricMap.h +++ b/IsometricMap/isometricMap.h @@ -12,6 +12,8 @@ typedef struct IsometricMap{ int originY; int width; int height; + int widthBounds; + int heightBounds; } IsometricMap; // TODO: @@ -24,7 +26,7 @@ IsometricMap * IsometricMapInit(int x, int y, int layer); Vector2 * IsometricMapCalcOffsetForTileAt(int x, int y, int textureSize); Tile * IsometricMapGetTileFromArrayPosition(IsometricMap *isometricMap, int x, int y); // Screen Coordinates -> World Coordinates -void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, int y, Vector2 *tmp); +void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x, float y, Vector2 *tmp); void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId); void IsometricMapChangeTextureIdOfTile(IsometricMap *map, int x, int y, int id); diff --git a/IsometricMap/isometricRenderer.c b/IsometricMap/isometricRenderer.c index abf9343..a116fe1 100644 --- a/IsometricMap/isometricRenderer.c +++ b/IsometricMap/isometricRenderer.c @@ -35,21 +35,26 @@ void IsometricRendererDrawMap(IsometricRenderer *renderer, int height){ } } -void IsometricRendererRenderIsometricMap(IsometricMap *map, InputHandler *input){ +void IsometricRendererRenderIsometricMap(IsometricMap **map, InputHandler *input){ + int n = 0; int i = 0; int j = 0; - for(i=0; i < map->sizeX; i++){ - for(j=0; j < map->sizeY; j++){ - Vector2 *offset = IsometricMapCalcOffsetForTileAt(i,j, map->tileTextures[0].width); - - float x = map->originX + offset->x; - float y = map->originY + offset->y; - - int textureId = map->tiles[i][j]->textureId; - - DrawTexture(map->tileTextures[textureId], x, y, WHITE); + for(n = 0; n < 9; n++){ + if(map[n] == 0){ + break; + } + for(i=0; i < map[n]->sizeX; i++){ + for(j=0; j < map[n]->sizeY; j++){ + Vector2 *offset = IsometricMapCalcOffsetForTileAt(i,j, map[n]->tileTextures[0].width); + + float x = map[n]->originX + offset->x; + float y = map[n]->originY + offset->y; + + int textureId = map[n]->tiles[i][j]->textureId; + + DrawTexture(map[n]->tileTextures[textureId], x, y, WHITE); + } } } - } diff --git a/IsometricMap/isometricRenderer.h b/IsometricMap/isometricRenderer.h index b282892..685ec6c 100644 --- a/IsometricMap/isometricRenderer.h +++ b/IsometricMap/isometricRenderer.h @@ -10,6 +10,6 @@ typedef struct IsometricRenderer{ void IsometricRendererDrawMap(IsometricRenderer *renderer, int height); -void IsometricRendererRenderIsometricMap(IsometricMap *map, InputHandler *input); +void IsometricRendererRenderIsometricMap(IsometricMap **map, InputHandler *input); #endif \ No newline at end of file diff --git a/README.md b/README.md index 72a77fa..473ed99 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,4 @@ Fantasy Welt oder Realistisch? ## TODO + Sprites in LinkedList speichern -+ LinkedList erweitern -+ IsometricMap Array erstellen für die verschiedenen Layer -+ Auswählen von Tiles auf höheren Layern \ No newline at end of file ++ LinkedList erweitern \ No newline at end of file diff --git a/main.c b/main.c index 052b2a5..32a9a62 100644 --- a/main.c +++ b/main.c @@ -29,7 +29,7 @@ int main(){ inputHandler.cursorPos.y = 0; inputHandler.selectedTile.x = 0; inputHandler.selectedTile.y = 0; - inputHandler.selectedLayer = 0; + inputHandler.selectedLayer = -1; Camera2D camera = { 0 }; camera.target = (Vector2){0, 0}; @@ -39,13 +39,18 @@ int main(){ // TODO -> Isometric Map Array for multiple Layers // -> Make only most upper layer selectable // take selected Tile, if that tile has one above select a tile in the upper layer - IsometricMap *map = IsometricMapInit(50, 80, 0); - IsometricMap *Layer1 = IsometricMapInit(20, 20, 1); - IsometricMap *Layer2 = IsometricMapInit(15, 15, 2); - IsometricMap *Layer3 = IsometricMapInit(10, 10, 3); - IsometricMap *Layer4 = IsometricMapInit(4, 4, 4); + //IsometricMap *map = IsometricMapInit(50, 80, 0); + //IsometricMap *Layer1 = IsometricMapInit(20, 20, 1); + //IsometricMap *Layer2 = IsometricMapInit(15, 15, 2); + //IsometricMap *Layer3 = IsometricMapInit(10, 10, 3); + //IsometricMap *Layer4 = IsometricMapInit(4, 4, 4); + + IsometricMap **layers = (IsometricMap **) malloc(10*sizeof(IsometricMap *)); + + layers[0] = IsometricMapInit(50, 80, 0); + layers[1] = IsometricMapInit(20, 20, 1); + layers[2] = IsometricMapInit(15, 10, 2); - IsometricMapAddTile(Layer4, 2, 2, 1); SetTargetFPS(60); while(!WindowShouldClose()){ @@ -56,11 +61,13 @@ int main(){ BeginMode2D(camera); - IsometricRendererRenderIsometricMap(map, &inputHandler); - IsometricRendererRenderIsometricMap(Layer1, &inputHandler); - IsometricRendererRenderIsometricMap(Layer2, &inputHandler); - IsometricRendererRenderIsometricMap(Layer3, &inputHandler); - IsometricRendererRenderIsometricMap(Layer4, &inputHandler); + //IsometricRendererRenderIsometricMap(map, &inputHandler); + //IsometricRendererRenderIsometricMap(Layer1, &inputHandler); + //IsometricRendererRenderIsometricMap(Layer2, &inputHandler); + //IsometricRendererRenderIsometricMap(Layer3, &inputHandler); + //IsometricRendererRenderIsometricMap(Layer4, &inputHandler); + + IsometricRendererRenderIsometricMap(layers, &inputHandler); ListDrawAllSprites(sprites); @@ -72,7 +79,7 @@ int main(){ DrawSprite(&cursorSprite); // User Input Handling - mouseInput(&inputHandler, sprites, &texture, &camera, map); + mouseInput(&inputHandler, sprites, &texture, &camera, layers); keyboardInput(&inputHandler, &camera); // Sprites move towards their destination