diff --git a/Input/inputHandler.c b/Input/inputHandler.c index 6bf4066..95ea24a 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 @@ -51,17 +52,20 @@ Vector2 GetRectangle(Vector2 rectStart){ return rectStart; } -void mouseInput(InputHandler *inputHandler, Sprite *sprites, int *spriteAmount, Texture2D *texture, Camera2D *camera){ +void mouseInput(InputHandler *inputHandler, Sprite *sprites, int *spriteAmount, Texture2D *texture, Camera2D *camera, IsometricMap *map){ inputHandler->cursorPos.x = GetMousePosition().x; inputHandler->cursorPos.y = GetMousePosition().y; + inputHandler->selectedTile = IsometricMapProject(map, camera, inputHandler->cursorPos.x, inputHandler->cursorPos.y); + 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 cf0ddc0..5b66888 100644 --- a/Input/inputHandler.h +++ b/Input/inputHandler.h @@ -2,14 +2,16 @@ #define INPUTHANDLER_H_ #include "raylib.h" #include "../sprite.h" +#include "../IsometricMap/isometricMap.h" typedef struct InputHandler{ int pressed; Vector2 rectStart; Vector2 cursorPos; + Vector2 selectedTile; } InputHandler; -void mouseInput(InputHandler *inputHandler, Sprite *sprites, int *spriteAmount, Texture2D *texture, Camera2D *camera); +void mouseInput(InputHandler *inputHandler, Sprite *sprites, int *spriteAmount, Texture2D *texture, Camera2D *camera, IsometricMap *map); void keyboardInput(InputHandler *inputHandler, Camera2D *camera); diff --git a/IsometricMap/isometricMap.c b/IsometricMap/isometricMap.c index 7865edf..758de60 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]); +} + +Vector2 IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, int y){ + + float tileWidthHalf = isometricMap->tileTextures[0].width / 2; + float tileHeightHalf = isometricMap->tileTextures[0].height / 2; + + x += camera->target.x; + y += camera->target.y; + + 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 = {isoX, isoY}; + + return tmp; +} + + diff --git a/IsometricMap/isometricMap.h b/IsometricMap/isometricMap.h index 03b833d..4e0a35f 100644 --- a/IsometricMap/isometricMap.h +++ b/IsometricMap/isometricMap.h @@ -8,15 +8,25 @@ 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); +// Screen Coordinates -> World Coordinates +Vector2 IsometricMapProject(IsometricMap *isometricMap, Camera2D *camera, int x, int 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); + + #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/inputHandler.o b/inputHandler.o new file mode 100644 index 0000000..78e05a2 Binary files /dev/null and b/inputHandler.o differ diff --git a/isometricMap.o b/isometricMap.o new file mode 100644 index 0000000..8291044 Binary files /dev/null and b/isometricMap.o differ diff --git a/isometricRenderer.o b/isometricRenderer.o new file mode 100644 index 0000000..747892a Binary files /dev/null and b/isometricRenderer.o differ diff --git a/list.o b/list.o new file mode 100644 index 0000000..0ca6366 Binary files /dev/null and b/list.o differ diff --git a/main.c b/main.c index 2e9d7c7..6f1a072 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()){ @@ -40,6 +40,9 @@ int main(){ BeginMode2D(camera); IsometricRendererRenderIsometricMap(map); + Vector2 tmp = IsometricMapProject(map, &camera, inputHandler.cursorPos.x, inputHandler.cursorPos.y); + + printf("%f %f \n", tmp.x, tmp.y); int i; for(i=0; i < spriteAmount; i++){ @@ -56,7 +59,7 @@ int main(){ DrawSprite(&cursorSprite); // User Input Handling - mouseInput(&inputHandler, sprites, &spriteAmount, &texture, &camera); + mouseInput(&inputHandler, sprites, &spriteAmount, &texture, &camera, map); keyboardInput(&inputHandler, &camera); // Sprites move towards their destination diff --git a/main.o b/main.o new file mode 100644 index 0000000..470e776 Binary files /dev/null and b/main.o differ diff --git a/spiel b/spiel new file mode 100755 index 0000000..d3d18d9 Binary files /dev/null and b/spiel differ diff --git a/sprite.o b/sprite.o new file mode 100644 index 0000000..cc41f75 Binary files /dev/null and b/sprite.o differ diff --git a/tile.o b/tile.o new file mode 100644 index 0000000..ec204ad Binary files /dev/null and b/tile.o differ