diff --git a/Input/inputHandler.c b/Input/inputHandler.c index e722d63..7bf8d95 100644 --- a/Input/inputHandler.c +++ b/Input/inputHandler.c @@ -1,6 +1,7 @@ #include "inputHandler.h" #include "raylib.h" #include "../sprite.h" +#include "../IsometricMap/isometricMap.h" #include #include #include @@ -52,17 +53,20 @@ Vector2 GetRectangle(Vector2 rectStart){ return rectStart; } -void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera){ +void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap *map){ inputHandler->cursorPos.x = GetMousePosition().x; inputHandler->cursorPos.y = GetMousePosition().y; + IsometricMapProject(map, camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y, &inputHandler->selectedTile); + if(IsMouseButtonPressed(MOUSE_BUTTON_LEFT)){ if(inputHandler->pressed == 0){ inputHandler->rectStart.x = GetMousePosition().x; inputHandler->rectStart.y = GetMousePosition().y; inputHandler->pressed = 1; } + } if(inputHandler->pressed){ diff --git a/Input/inputHandler.h b/Input/inputHandler.h index 6e7194f..8c989bd 100644 --- a/Input/inputHandler.h +++ b/Input/inputHandler.h @@ -3,14 +3,16 @@ #include "raylib.h" #include "../sprite.h" #include "../List/list.h" +#include "../IsometricMap/isometricMap.h" typedef struct InputHandler{ int pressed; Vector2 rectStart; Vector2 cursorPos; + Vector2 selectedTile; } InputHandler; -void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera); +void mouseInput(InputHandler *inputHandler, List *sprites, Texture2D *texture, Camera2D *camera, IsometricMap *map); void keyboardInput(InputHandler *inputHandler, Camera2D *camera); diff --git a/IsometricMap/isometricMap.c b/IsometricMap/isometricMap.c index 7865edf..957ab94 100644 --- a/IsometricMap/isometricMap.c +++ b/IsometricMap/isometricMap.c @@ -1,12 +1,20 @@ #include "isometricMap.h" #include #include +#include "tile.h" +#include "raymath.h" +#include "raylib.h" IsometricMap * IsometricMapInit(int x, int y){ 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 = 0; + map->width = x * map->tileTextures[0].width; + map->height = y * map->tileTextures[0].height; + Tile* tiles[x]; int n = 0; for(n=0; ntiles[x][y]); +} + +void IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, int y, Vector2 *tmp){ + + int mouseAdjustmentX = -8; + int mouseAdjustmentY = -4; + + float tileWidthHalf = isometricMap->tileTextures[0].width / 2; + float tileHeightHalf = isometricMap->tileTextures[0].height / 4; + + x += camera->target.x + mouseAdjustmentX; + y += camera->target.y + mouseAdjustmentY; + + float xPos = (float) x; + float yPos = (float) y; + + + int isoX = 0.5 * ( xPos / tileWidthHalf + yPos / tileHeightHalf); + int isoY = 0.5 * ( -xPos / tileWidthHalf + yPos / tileHeightHalf); + + + //Vector2 tmp = {isoX * tileWidthHalf * 2, isoY * tileHeightHalf * 2}; + //Vector2* tmp = (Vector2 *) malloc(sizeof(Vector2)); + tmp->x = isoX; + tmp->y = isoY; + + //return tmp; +} + + diff --git a/IsometricMap/isometricMap.h b/IsometricMap/isometricMap.h index 03b833d..50d0661 100644 --- a/IsometricMap/isometricMap.h +++ b/IsometricMap/isometricMap.h @@ -8,15 +8,24 @@ typedef struct IsometricMap{ Tile **tiles; int sizeX; int sizeY; + int originX; + int originY; + int width; + int height; } IsometricMap; // TODO: -void IsometricMapAddTile(IsometricMap isometricMap); -Tile IsometricMapGetTileFromArrayPosition(int x, int y); -Tile IsometricMapGetTileFromWorldCoordinates(float x, float y); -Vector2 * IsometricMapCalcOffsetForTileAt(int x, int y, int textureSize); +void IsometricMapAddTile(IsometricMap *isometricMap, int x, int y, int textureId); +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 x, int y); +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); + #endif \ No newline at end of file diff --git a/IsometricMap/isometricRenderer.c b/IsometricMap/isometricRenderer.c index ed2c6ac..7a88c64 100644 --- a/IsometricMap/isometricRenderer.c +++ b/IsometricMap/isometricRenderer.c @@ -1,6 +1,7 @@ #include "isometricRenderer.h" #include "raylib.h" #include "isometricMap.h" +#include "../Input/inputHandler.h" #include //TODO: Isometric Tilemap Struct, which can be scanned for clicked Tile @@ -34,10 +35,7 @@ void IsometricRendererDrawMap(IsometricRenderer *renderer, int height){ } } -void IsometricRendererRenderIsometricMap(IsometricMap *map){ - - float originX = 0.0f; - float originY = 0.0f; +void IsometricRendererRenderIsometricMap(IsometricMap *map, InputHandler *input){ int i = 0; int j = 0; @@ -45,13 +43,13 @@ void IsometricRendererRenderIsometricMap(IsometricMap *map){ for(j=0; j < map->sizeY; j++){ Vector2 *offset = IsometricMapCalcOffsetForTileAt(i,j, map->tileTextures[0].width); - float x = originX + offset->x; - float y = originY + offset->y; + float x = map->originX + offset->x; + float y = map->originY + offset->y; // TODO -> results in Segmentation fault //int textureId = map->tiles[i][j].textureId; int textureId = 0; - if(i + j == 9){ + if(i == input->selectedTile.x && j == input->selectedTile.y){ textureId = 1; } DrawTexture(map->tileTextures[textureId], x, y, WHITE); diff --git a/IsometricMap/isometricRenderer.h b/IsometricMap/isometricRenderer.h index 148d444..b282892 100644 --- a/IsometricMap/isometricRenderer.h +++ b/IsometricMap/isometricRenderer.h @@ -2,6 +2,7 @@ #define ISOMETRICRENDERER_H_ #include "raylib.h" #include "isometricMap.h" +#include "../Input/inputHandler.h" typedef struct IsometricRenderer{ Texture *texture; @@ -9,6 +10,6 @@ typedef struct IsometricRenderer{ void IsometricRendererDrawMap(IsometricRenderer *renderer, int height); -void IsometricRendererRenderIsometricMap(IsometricMap *map); +void IsometricRendererRenderIsometricMap(IsometricMap *map, InputHandler *input); #endif \ No newline at end of file diff --git a/main.c b/main.c index 890bce7..28c66bb 100644 --- a/main.c +++ b/main.c @@ -28,7 +28,7 @@ int main(){ camera.rotation = 0.0f; camera.zoom = 1.0f; - IsometricMap *map = IsometricMapInit(20, 10); + IsometricMap *map = IsometricMapInit(20, 20); SetTargetFPS(60); while(!WindowShouldClose()){ @@ -39,10 +39,10 @@ int main(){ BeginMode2D(camera); - IsometricRendererRenderIsometricMap(map); + IsometricRendererRenderIsometricMap(map, &inputHandler); ListDrawAllSprites(sprites); - + EndMode2D(); // Moving cursor Sprite to Mouse Pos and drawing it @@ -51,7 +51,7 @@ int main(){ DrawSprite(&cursorSprite); // User Input Handling - mouseInput(&inputHandler, sprites, &texture, &camera); + mouseInput(&inputHandler, sprites, &texture, &camera, map); keyboardInput(&inputHandler, &camera); // Sprites move towards their destination