diff --git a/.vscode/settings.json b/.vscode/settings.json index 25c16d3..6c2e911 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,7 @@ "files.associations": { "isometricrenderer.h": "c", "sprite.h": "c", - "map": "c" + "map": "c", + "isometricmap.h": "c" } } \ No newline at end of file diff --git a/Input/inputHandler.c b/Input/inputHandler.c index 524e0a0..05a342f 100644 --- a/Input/inputHandler.c +++ b/Input/inputHandler.c @@ -67,8 +67,12 @@ void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, C // TODO: n=2 no good style, but Segmentation fault when > layerAmount for(n = 9; n >= 0 ; n--){ if(layers[n] != 0){ + float tileWidthHalf = layers[n]->tileTextures[0].width / 2; + float tileHeightQuarter = layers[n]->tileTextures[0].height / 4; + int mouseAdjustmentX = -tileWidthHalf; + int mouseAdjustmentY = -tileHeightQuarter + (tileHeightQuarter * layers[n]->layer); - IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->cursorWorldPos); + IsometricMapProject(layers[n], camera, inputHandler->cursorPos.x + mouseAdjustmentX, inputHandler->cursorPos.y + mouseAdjustmentY, &inputHandler->cursorWorldPos); Tile *selectedTile = IsometricMapGetTileFromWorldCoordinates(layers[n], inputHandler->cursorWorldPos.x, inputHandler->cursorWorldPos.y); diff --git a/IsometricMap/isometricMap.c b/IsometricMap/isometricMap.c index d3325f6..486d968 100644 --- a/IsometricMap/isometricMap.c +++ b/IsometricMap/isometricMap.c @@ -64,12 +64,8 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x, 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; + x += camera->target.x; + y += camera->target.y; float xPos = (float) x; float yPos = (float) y; @@ -82,11 +78,29 @@ void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, float x, tmp->y = isoY * isometricMap->tileTextures[0].height; } +void IsometricMapUnproject(IsometricMap *isometricMap, Camera2D *camera, int x, int y, Vector2 *tmp){ + + float xPos = (float) x; + float yPos = (float) y; + + float worldX = (xPos - yPos) / 2; + float worldY = (xPos + yPos) / 4; + + worldX += camera->target.x; + worldY += camera->target.y; + + tmp->x = worldX; + tmp->y = worldY; + +} + + + Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float x, float y){ x = (int)(x / isometricMap->tileTextures->width); - y = (int)(y / isometricMap->tileTextures->height); - + y = (int)(y / isometricMap->tileTextures->height); + Tile *ptr = (Tile *) malloc(sizeof(Tile *)); ptr->x = 0; ptr->y = 0; diff --git a/IsometricMap/isometricMap.h b/IsometricMap/isometricMap.h index fdb2681..172e98c 100644 --- a/IsometricMap/isometricMap.h +++ b/IsometricMap/isometricMap.h @@ -17,8 +17,6 @@ typedef struct IsometricMap{ // TODO: Tile * IsometricMapGetTileFromWorldCoordinates(IsometricMap *isometricMap, float x, float y); -// World Coordinates -> Screen Coordinates -Vector2 IsometricMapUnproject(IsometricMap *isometricMap, Camera2D *camera, int x, int y); // Working IsometricMap * IsometricMapInit(int layer); @@ -26,7 +24,8 @@ 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, float x, float y, Vector2 *tmp); - +// World Coordinates -> Screen Coordinates +void IsometricMapUnproject(IsometricMap *isometricMap, Camera2D *camera, int x, int 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/README.md b/README.md index 473ed99..1f4cd33 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ KI Gegner ist erstmal zu aufwändig, ein wenig Ackern muss man aber immer! Fantasy Welt oder Realistisch? ## Isometrie in RayLib -[Projection Orthogonal -> Isometric](https://gamedevelopment.tutsplus.com/tutorials/creating-isometric-worlds-a-primer-for-game-developers--gamedev-6511) +[Projection Orthogonal -> Isometric](https://clintbellanger.net/articles/isometric_math/) ## TODO diff --git a/inputHandler.o b/inputHandler.o index e29c5c6..00e4b49 100644 Binary files a/inputHandler.o and b/inputHandler.o differ diff --git a/isometricMap.o b/isometricMap.o index 63fe8af..7601d9d 100644 Binary files a/isometricMap.o and b/isometricMap.o differ diff --git a/isometricRenderer.o b/isometricRenderer.o index db7e73c..45aa438 100644 Binary files a/isometricRenderer.o and b/isometricRenderer.o differ diff --git a/list.o b/list.o index b6b631b..e71d5f1 100644 Binary files a/list.o and b/list.o differ diff --git a/main.c b/main.c index e046394..2e6fbbe 100644 --- a/main.c +++ b/main.c @@ -57,17 +57,10 @@ int main(){ camera.rotation = 0.0f; camera.zoom = 1.0f; - // 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 **layers = (IsometricMap **) malloc(10*sizeof(IsometricMap *)); + // Test Layers --- + int n = 0; int i = 0; int j = 0; @@ -110,6 +103,16 @@ int main(){ } } + // ------- + + // Test of the IsometricMapUnproject Function + //Vector2 asdf = {500, 600}; + //printf("unprojected %f %f\n",asdf.x, asdf.y); + //IsometricMapProject(layers[0], &camera, asdf.x, asdf.y, &asdf); + //printf("projected %f %f\n",asdf.x, asdf.y); + //IsometricMapUnproject(layers[0], &camera, asdf.x, asdf.y, &asdf); + //printf("unprojected %f %f\n",asdf.x, asdf.y); + // Hides the operating systems own cursor HideCursor(); SetTargetFPS(60); diff --git a/main.o b/main.o index 2874e99..844c520 100644 Binary files a/main.o and b/main.o differ diff --git a/spiel b/spiel index 40605ca..cf5aad5 100755 Binary files a/spiel and b/spiel differ diff --git a/sprite.c b/sprite.c index fb668c9..4b23b3c 100644 --- a/sprite.c +++ b/sprite.c @@ -2,6 +2,7 @@ #include "raylib.h" #include #include +#include "IsometricMap/isometricMap.h" void SpriteAdd(Sprite *sprites, int *spriteAmount, Texture2D *texture, int x, int y){ if(*spriteAmount < 100){ diff --git a/sprite.o b/sprite.o index 0dac02d..3ab2e3a 100644 Binary files a/sprite.o and b/sprite.o differ diff --git a/tile.o b/tile.o index b7873fa..ec204ad 100644 Binary files a/tile.o and b/tile.o differ