From 7fc443483615a6b809158402f17b91969d4c38b5 Mon Sep 17 00:00:00 2001 From: JanEhehalt Date: Wed, 23 Nov 2022 22:28:25 +0100 Subject: [PATCH 1/2] 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 From f69445c5c73d609fc626cac3d90a6da9b9ab0c21 Mon Sep 17 00:00:00 2001 From: JanEhehalt Date: Thu, 24 Nov 2022 09:21:04 +0100 Subject: [PATCH 2/2] multiple layers --- Input/inputHandler.c | 16 ++++----- Input/inputHandler.h | 2 +- IsometricMap/isometricMap.c | 58 +++++++++++++------------------ IsometricMap/isometricMap.h | 5 ++- IsometricMap/isometricRenderer.c | 24 +++++++------ inputHandler.o | Bin 0 -> 5984 bytes isometricMap.o | Bin 0 -> 4712 bytes isometricRenderer.o | Bin 0 -> 2840 bytes list.o | Bin 0 -> 3168 bytes main.c | 47 ++++++++++++++++++++++--- main.o | Bin 0 -> 5128 bytes spiel | Bin 0 -> 26968 bytes sprite.o | Bin 0 -> 2648 bytes tile.o | Bin 0 -> 1072 bytes 14 files changed, 91 insertions(+), 61 deletions(-) create mode 100644 inputHandler.o create mode 100644 isometricMap.o create mode 100644 isometricRenderer.o create mode 100644 list.o create mode 100644 main.o create mode 100755 spiel create mode 100644 sprite.o create mode 100644 tile.o diff --git a/Input/inputHandler.c b/Input/inputHandler.c index 1618af9..2654a0a 100644 --- a/Input/inputHandler.c +++ b/Input/inputHandler.c @@ -62,22 +62,22 @@ void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, C // resetting last selected Tile to grass texture int n = 9; if(inputHandler->selectedLayer != -1){ - IsometricMapChangeTextureIdOfTile(layers[inputHandler->selectedLayer], (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 0); + IsometricMapChangeTextureIdOfTile(layers[inputHandler->selectedLayer], (int) inputHandler->cursorWorldPos.x, (int) inputHandler->cursorWorldPos.y, 0); } - for(n = 2; n >= 0 ; n--){ + // TODO: n=2 no good style, but Segmentation fault when > layerAmount + for(n = 10; n >= 0 ; n--){ if(layers[n] != 0){ - IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->selectedTile); + IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->cursorWorldPos); - Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(layers[n], inputHandler->selectedTile.x, inputHandler->selectedTile.y); + Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(layers[n], inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y); if(selectedTile != 0){ - //printf("ALARM bei n = %d \n", n); - inputHandler->selectedTile.x = selectedTile->x; - inputHandler->selectedTile.y = selectedTile->y; + inputHandler->cursorWorldPos.x = selectedTile->x; + inputHandler->cursorWorldPos.y = selectedTile->y; // setting currently selected tile to tower inputHandler->selectedLayer = n; - IsometricMapChangeTextureIdOfTile(layers[n], (int) inputHandler->selectedTile.x, (int) inputHandler->selectedTile.y, 1); + IsometricMapChangeTextureIdOfTile(layers[n], (int) inputHandler->cursorWorldPos.x, (int) inputHandler->cursorWorldPos.y, 1); break; } } diff --git a/Input/inputHandler.h b/Input/inputHandler.h index aa82b38..e44b151 100644 --- a/Input/inputHandler.h +++ b/Input/inputHandler.h @@ -9,7 +9,7 @@ typedef struct InputHandler{ int pressed; Vector2 rectStart; Vector2 cursorPos; - Vector2 selectedTile; + Vector2 cursorWorldPos; int selectedLayer; } InputHandler; diff --git a/IsometricMap/isometricMap.c b/IsometricMap/isometricMap.c index 839f8e9..d3325f6 100644 --- a/IsometricMap/isometricMap.c +++ b/IsometricMap/isometricMap.c @@ -5,39 +5,37 @@ #include "raymath.h" #include "raylib.h" -IsometricMap * IsometricMapInit(int x, int y, int layer){ +IsometricMap * IsometricMapInit(int layer){ IsometricMap* map = (IsometricMap *) malloc(sizeof(IsometricMap)); map->tileTextures[0] = LoadTexture("assets/grass.png"); map->tileTextures[1] = LoadTexture("assets/tower.png"); map->originX = 0; map->originY = -layer * map->tileTextures[0].width / 4; - map->width = x * map->tileTextures[0].width; - map->height = y * map->tileTextures[0].height; + map->width = 100 * map->tileTextures[0].width; + map->height = 100 * map->tileTextures[0].height; map->widthBounds = 100; map->heightBounds = 100; + map->layer = layer; - Tile*** tiles = (Tile***)malloc(x*sizeof(Tile*)); + Tile*** tiles = (Tile***)malloc(map->widthBounds*sizeof(Tile*)); int n = 0; - for(n=0; nwidthBounds; n++){ + tiles[n] = (Tile**)malloc(map->heightBounds*sizeof(Tile*)); } - map->sizeX = x; - map->sizeY = y; - int i = 0; int j = 0; - - for(i=0; i < x; i++){ - for(j=0; j < y; j++){ + for(i=0; i < map->widthBounds; i++){ + for(j=0; j < map->heightBounds; j++){ Tile *tmp = (Tile *) malloc(sizeof(Tile)); - tmp->textureId = 0; + tmp->textureId = -1; tmp->x = i; tmp->y = j; tiles[i][j] = tmp; } } + map->tiles = tiles; return map; @@ -63,12 +61,13 @@ Tile * IsometricMapGetTileFromArrayPosition(IsometricMap *map, int x, int y){ 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 tileHeightQuarter = isometricMap->tileTextures[0].height / 4; + int mouseAdjustmentX = -tileWidthHalf; + int mouseAdjustmentY = -tileHeightQuarter + (tileHeightQuarter * isometricMap->layer); + + x += camera->target.x + mouseAdjustmentX; y += camera->target.y + mouseAdjustmentY; @@ -92,11 +91,13 @@ Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float ptr->x = 0; ptr->y = 0; - if( x < isometricMap->sizeX && y < isometricMap->sizeY && + if( x < isometricMap->widthBounds && y < isometricMap->heightBounds && x >= 0 && y >= 0 ){ - ptr->x = isometricMap->tiles[(int)x][(int)y]->x; - ptr->y = isometricMap->tiles[(int)x][(int)y]->y; - return ptr; + if(isometricMap->tiles[(int)x][(int)y]->textureId != -1){ + ptr->x = isometricMap->tiles[(int)x][(int)y]->x; + ptr->y = isometricMap->tiles[(int)x][(int)y]->y; + return ptr; + } } ptr = 0; return ptr; @@ -105,23 +106,14 @@ Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId){ - - //if(x < isometricMap->sizeX && y < isometricMap->sizeY){ - - Tile *tile = (Tile *) malloc(sizeof(Tile)); - tile->textureId = textureId; - tile->x = x; - tile->y = y; + isometricMap->tiles[x][y]->textureId = textureId; + isometricMap->tiles[x][y]->x = x; + isometricMap->tiles[x][y]->y = y; - //Tile tile = {textureId, x, y}; - isometricMap->tiles[x][y] = tile; - - //} - } void IsometricMapChangeTextureIdOfTile(IsometricMap *map, int x, int y, int id){ - if( x < map->sizeX && y < map->sizeY && + if( x < map->widthBounds && y < map->heightBounds && x >= 0 && y >= 0 ){ (map->tiles[x][y])->textureId = id; } diff --git a/IsometricMap/isometricMap.h b/IsometricMap/isometricMap.h index 1c08503..fdb2681 100644 --- a/IsometricMap/isometricMap.h +++ b/IsometricMap/isometricMap.h @@ -6,14 +6,13 @@ typedef struct IsometricMap{ Texture2D tileTextures[10]; Tile ***tiles; - int sizeX; - int sizeY; int originX; int originY; int width; int height; int widthBounds; int heightBounds; + int layer; } IsometricMap; // TODO: @@ -22,7 +21,7 @@ Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float Vector2 IsometricMapUnproject(IsometricMap *isometricMap, Camera2D *camera, int x, int y); // Working -IsometricMap * IsometricMapInit(int x, int y, int layer); +IsometricMap * IsometricMapInit(int layer); Vector2 * IsometricMapCalcOffsetForTileAt(int x, int y, int textureSize); Tile * IsometricMapGetTileFromArrayPosition(IsometricMap *isometricMap, int x, int y); // Screen Coordinates -> World Coordinates diff --git a/IsometricMap/isometricRenderer.c b/IsometricMap/isometricRenderer.c index a116fe1..46788c3 100644 --- a/IsometricMap/isometricRenderer.c +++ b/IsometricMap/isometricRenderer.c @@ -40,20 +40,22 @@ void IsometricRendererRenderIsometricMap(IsometricMap **map, InputHandler *input int n = 0; int i = 0; int j = 0; - for(n = 0; n < 9; n++){ + for(n = 0; n < 10; 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); + for(i=0; i < map[n]->widthBounds; i++){ + for(j=0; j < map[n]->heightBounds; j++){ + if(map[n]->tiles[i][j]->textureId != -1){ + 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/inputHandler.o b/inputHandler.o new file mode 100644 index 0000000000000000000000000000000000000000..96e85f936d9165275f8b4b8bac8455de73edc61f GIT binary patch literal 5984 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 literal 0 HcmV?d00001 diff --git a/isometricRenderer.o b/isometricRenderer.o new file mode 100644 index 0000000000000000000000000000000000000000..c9cb721c3265164287c47c5f7cf2f5c16c95cb9a GIT binary patch literal 2840 zcmbtU-ESL35Z|*+>O#Xgs7OUcUf-=0?f?au5-RP;-e$2 zcjq_ro1L8*-&=Gv>XRfQL?Taw}Ti}>2T3#NV!M1y<71`z$yl` zc`c`)e1n#*PWUgc$ZR#=@Hx?Y=+?*0Pn#fD3TC;RkR~y2+6U4!Z(?p+^LT<&(4`Fa7ja zvuV+_R>lLgw9sYHigY_*q$-j@OW;~MN!R3SpMdM~GPBM#zJyFXePL#9r9g{L{oA`? zgPTwKu=GWCon77kxt$3XS1LmB8Pwp?BVZRT`_|R6kL;Fp=2?sD5Xp*_Sn_L@|IY7( zvts3TofwU#eCg%g16dORYpe|KG;f&&r%Wc@*d<$Q5g&w|h1zdGBjD@|MP*k87R1Gf z1Ox@<=+2&I(%L@^Otm#I6&#q(7uo}4(Hct@nOS7{st;>vZ~6Z?R~_GDE!Lm}1GFqJ zJq}~!jMXllRok;9Fa7o>dKM*Pp}1GR_8DlmB{6_xWN7F__)u&rm)3LP0p*y|ceFoe zYyEFN(WmqsQ~D1(ID{hsSRq(D+PLeZ>+z6E%EwTVxGiDM#oPLj>gBM(KB>1J~?=5 zl*S2KC)EpjPE&VMov^Kl7{#p&CFYXj)6-d1k7l&V**SF(GbLmU8w!H6bq}mR@KX+= z<6M9s4qx>a{sC{L*FOwCC`jW}TgUpL2wc>QDA|iCJuwBlt~vXRIBDu!Leb%&L^+?( z6GWNHW{Hx_q*7`cuyjUO75Gma&FYEdYg~Udom1wu%)F}U7l~p=P-o)PS|X)73Ebgt z82DH!?_@>*LwNuT;u2og7IF|y=n`om&fymxka7HO*pVwH`T)lt>qLkU-Ylj-54W?A9#=nUL5=n?uF&$ hBj)WLK;$f+pZ8F4iMQ50VC%%6;rY+GxOnvP{{}RiRyY6v literal 0 HcmV?d00001 diff --git a/list.o b/list.o new file mode 100644 index 0000000000000000000000000000000000000000..eb4318e2280fe88d0172908cc5b38143197e37ff GIT binary patch literal 3168 zcmb_dO=w(I6h1Rk(=knxv4}=mJ2IWz=gO+z3OL$2>tN8D~H8Y?!#*^Vc zdWP&oy4`aWW^W|p4DF4)@|_aWD0E$E_jOVki;NuyE5^*%ukJ&1n{7m_t(dIsXdAt@ z-S!>rbh45g-RKe2VO2}}ZX1uL*iw48DJ2G-v^#w}dZKT^IG`)KFW?Q8EU86Pft^Aq zyE`U9vcnXmY(FZA>>{%NkF|&WELfbZeM(}Y3an6Gz&{i}F73pLv~o-2uboE5JY0X~ zR;Jf8F;6rp)N{NEF*Iq#$F!_JD7$jTRPV_3Q1^e?!nA|0LiX&cb;UZnIyOECuLI1_ z%{^shmnu;`jI3#U%FazpMnal=@9~_So3bazBo4>04l4CNT=VCb07tD$SPB=>gK~q! zy9I-cIbAKDqjX%SWElON7}keoX?kbD^}r0!|Lk=~(CPhaclUn3mp8~XJ0 zU-tA@2uJGDr>Fm_r~j02q;vF9`nphy+C*GbIl6vB>IsS?dP9!E?+07#H>5qzMG#@F~P8 zj`A11MJ#_0`xowkU*tGN723;C#BDC{z0g13Sn;7eU%W6oQ!HO76fWf#%ZoF!#e5lRUbWhgwxwXb9u^wG zh8L_rGYVVKBxF?tdcNNBgRl@Z>Y*mjddqLKxGwSM0&iocTD^p>q2B@$B@gfr*G<2@ zAzXhQNV>*29glva3ctZP*$->@=Zq_R4s-B@Wbc4N zqIz_EmHT3z>!ya&8>8Y_$P=iHcz^=4fU`i}~!npq5<-e#c zcBKB(zmW1*{g2B{E)E4n+UEn)TSxDO=}$4^uIfpizfVxFlX-vC-#Gs@P890S$eaFu E1AQhP#{d8T literal 0 HcmV?d00001 diff --git a/main.c b/main.c index 32a9a62..0f9f84d 100644 --- a/main.c +++ b/main.c @@ -27,8 +27,8 @@ int main(){ inputHandler.rectStart.y = 0; inputHandler.cursorPos.x = 0; inputHandler.cursorPos.y = 0; - inputHandler.selectedTile.x = 0; - inputHandler.selectedTile.y = 0; + inputHandler.cursorWorldPos.x = 0; + inputHandler.cursorWorldPos.y = 0; inputHandler.selectedLayer = -1; Camera2D camera = { 0 }; @@ -47,10 +47,47 @@ int main(){ 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); + int n = 0; + int i = 0; + int j = 0; + for(n = 0; n < 10; n++){ + layers[n] = IsometricMapInit(n); + } + + for(n = 0; n <= 10; n++){ + for(i = 0; i < 100; i++){ + for(j = 0; j < 100; j++){ + switch(n){ + case 0: + IsometricMapAddTile(layers[n], i, j, 0); + break; + case 1: + if(i > 35 && i < 50 && j > 45 && j < 60){ + IsometricMapAddTile(layers[n], i, j, 0); + } + break; + case 2: + if(i > 40 && i < 44 && j > 50 && j < 54){ + IsometricMapAddTile(layers[n], i, j, 1); + } + break; + } + + } + } + } + + for(n = 0; n <= 10; n++){ + for(i = 0; i < 20-n*2; i++){ + for(j = 0; j < 20-n*2; j++){ + IsometricMapAddTile(layers[n], i, j, 0); + if(n == 9){ + IsometricMapAddTile(layers[n], i, j, 1); + } + } + } + } SetTargetFPS(60); while(!WindowShouldClose()){ diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..dfae5235c7636161ad0940fa3e31fb2f28d54c38 GIT binary patch literal 5128 zcmbuCZD?Cn7=TZjYU}KF(>b;3+@jm0Qy1HAiqqkec4=>=)v>ly+$7#6cWG>zTW)UL zrlXt0D-Bt;3Jw+gF%e-uLj|ud-nbBs3SmOd;q|jSL0OD! zCpawFE$~Da1$#?LdblKs-nq?Ls;R!I=2m@<`fAoj2R*s zdG<68?h~3f&vSN~x<|fFIreF((W)H(fHu%>lXC2xQsYtO`0LR4Z{gb*F@SzZ!qatg_UC;|5Gfc>7oL|(7;}! z3|ECO&NAg#0+_Tw--2UlfpEVUsAmw!+@Ymsi25Q!z7tXpE!|umARpS9W#IBYwzu+I zX;RA3VHgY_W<@`aSvk6$_AegtYG7x#firp(W-~Qh`snJJtI#!G$Xwn4r=qx=kgFtf zA#)i7QUu|9c6QQN>Wis~VrsmYI>O0CubLak^FyI#z7Zn_LT?bhR8$*|WN~lrL2wjQdNcb)m-poIl?3!L^aoYM9rO`_fYmUjhPGP zyE6+Vz1#pO1oKjI(%oQhLmxcZEG(Su2Qa$_mH{ZrS$|V{!KK&_l@ZwcJ-i!awVsc_ zewsN$Gt^ln=`;wPy-WvH_o+%EFQz7knJ5oTz0kp}3jQXTev!uFn2rAWvTrF)qrYJ` z$BY&SfKX#F1vEo&C5DYkO7m1X5m~Ps0Y~WJwojic@kLpvFhY-wqnlS2=`?VCHS72C z`Bl@CI7dXW-+)s{XMjG^zq?+^D|Ym64%u5K`|M0a-MpH<{jBS#qMFlx-xJvT>;)L> zpq7kp%#u@Vr{nvHbeSkGj*f?px|Wk9SwC@D`{gf6zBnrGmTamjvb{ zvRZ86rlVNQu;r$ss>U(lYm1vyPuWdwxKuT> z_#+M+7Qd>W#~t_{2W~jLSz~6GX=<9Qbz*{AUOLhXeo1fiHuNSZ)5B9QZ~D zj+bXOKLH2c=fFb_oQ!C(gfC1h66)%CvOUlfda|>#FW4XI5486LL!>(qvz}s?M313G z`t<`=%G60uENNjEn8xEqm~fG5!+VyBG zvBT8h28xo7xUQM)T6j2W8mUBtb@mz&y=_O?^)5XT(M{cCwH$z^gT4asc;BcQv-Bhh zCL-Jcb}&jtj8szZPK>53GOQmQG&D29TD$eIWteR}dLn8K5#D;jFkyJH7j*&p!Ws+% zJd3>9%=8Tzsd%I#ZX|UW2|W3Pg+fUS#uN$<4Ttt=u{gcoV9VfrNNN&Gd5CE&cPy^1n^uT@t@t;?GF@4v7zPF4n6V`mkJ) z^l{Ba++O~Q!L;s_cuL}HB>tJs>iQ0kN)_ W+=?c>>#Ny&_{WUJ+?1Y`_WuHse>eL8 literal 0 HcmV?d00001 diff --git a/spiel b/spiel new file mode 100755 index 0000000000000000000000000000000000000000..d142914f50478905fad1dd69a26d8cdd7c21e3e3 GIT binary patch literal 26968 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 Z-?KleUPYs0_DuQ*b_j{9910GU{a=xm);9nE literal 0 HcmV?d00001 diff --git a/sprite.o b/sprite.o new file mode 100644 index 0000000000000000000000000000000000000000..31f9dbafc463a4c18445a0b82a1f4a001a667c2b GIT binary patch literal 2648 zcmbtVO>7fK6n<+HaKVWeltU^av==Ih!q%y{fM~V(u`@`apd^keBx*L!wiN6*TCdfB z)E~(zVzff!21mGYM4YN#fKY+B<$wf-9#SbqmZ${C7ptn|zBfCAH=FgPebVfE?|XkU z@6Fgh=BD!rO#?+5d=6brp#U#;c4bS577Rc?v@!?&E-?NlYy4#}{(YPA`dh{eO@3-~ zlIJ#=qg~3}Xkt{LvRmxYMjzvAsJ59#tjTyH*0|ov9L{aFGJCC5Z~F$>)4lB? zUhi!e@q_X9r`8Z1x0i9aYrK9&BQLJMPP6Nu5l%;j)n|`YlV-6?L)fJz^G`MXlfyqh z^Df?pU&!m)6TW`1(}50O%vZ~0fT@Xzg8>8W$_!{Ly0$;PE47Lbg=&hr$Pd!P$qndN6BGSA zlfxRifPv5nTtsi^qwKjxGVup_fbcm_Hlzl9luzPH;6PXpqLMq{T_?_*jD5*;CUvT< zQAyE-tr%%Z(UmxS*LG0&)2X&o5%0y(AE<(4&w~MR3E=F+GKQL>TE1tc8+;and zK}oJtwoMOP0Oq3Y*3HR~)&M|Hljrr&dO9riB>M&2Uptmu(j|`s~L=y|!?L={5}!X(eE=2RX&6 z7bE^`Q2$8c(UMeC0sN;&^){3ym!&S*JRUmgQJ0*cl@hA?4SX;N>te=i)2 Hay0&5O?$VD literal 0 HcmV?d00001 diff --git a/tile.o b/tile.o new file mode 100644 index 0000000000000000000000000000000000000000..ab5577697d3b561c8f279c63aed45d60cd7d22fa GIT binary patch literal 1072 zcmbVL%}T>S5T11F?@4chmwHmcE{W8G9wbm|FCtzFy(TfJ*!+-ez+Utfd=wv{ujCWx z%yyS9yQ!c9Gqdx}d^7u#ypL{gI-UnwJh+Bcq)~uR0}Le`!Y=FpjEBRk-pM3xa?$iI z`GEWVppjAVcJ6b3z=P8zE?Hf)d#D?z1t%kMkn0jLO7GZ0q zF}W+3z+lq_5n;F^N5u0iQo>0p(56^R>Ugq+XkKGcz#OcI^mrTd4MzRVq$TdF|+|rcghdOZg8~v{0US lS_wK(IR0_Y-BIdZZM1EkqDr@q*1mg6Ocj4Bt5(K7{|^jnI4S@D literal 0 HcmV?d00001