diff options
-rw-r--r-- | makefile | 3 | ||||
-rw-r--r-- | src/editor.c | 70 | ||||
-rw-r--r-- | src/tiled.c | 58 | ||||
-rw-r--r-- | src/tiled.h | 9 | ||||
-rw-r--r-- | src/tiledfile.c | 9 | ||||
-rw-r--r-- | src/tiledfile.h | 4 |
6 files changed, 128 insertions, 25 deletions
@@ -9,6 +9,9 @@ install: tiled build: src/*.c src/*.h ${CC} src/*.c -o tiled ${FLAGS} +editor: src/*.c src/editor.c + ${CC} src/*.c -o editor ${FLAGS} + clean: tiled rm tiled diff --git a/src/editor.c b/src/editor.c new file mode 100644 index 0000000..2cf2f84 --- /dev/null +++ b/src/editor.c @@ -0,0 +1,70 @@ +#include <raylib.h> +#include <stdio.h> + +#include "tiled.h" + +int selectedTile[2] = {0, 0}; + +void update(Tiled *tiled) { + updateTiledCamera(tiled); + Vector2 mousePos = GetMousePosition(); + Vector2 mapPos = translateTiledPosition(*tiled, mousePos); + selectedTile[0] = mapPos.x; + selectedTile[1] = mapPos.y; +} + +void drawOverlay(Tiled tiled) { + Vector2 screenPos = translateTiledScreenPosition(tiled, (Vector2){selectedTile[0], selectedTile[1]}); + + DrawRectangleLinesEx((Rectangle) { + screenPos.x, + screenPos.y, + tiled.zoom, + tiled.zoom + }, tiled.zoom/16, GREEN); +} + +void modifyTile(Tiled *tiled, int x) { + int tile = getTiledMapTile(tiled->tiledMap, selectedTile); + int tileCount = tiled->tiledMap.atlasSize[0] * tiled->tiledMap.atlasSize[1] + 1; + tile = (tile + x) % (tileCount); + setTiledMapTile(tiled->tiledMap, selectedTile, tile); + renderTilemapTexture(&tiled->tilemapTexture, tiled->tiledMap); +} + +int launchEditor(TiledMap tiledMap) { + SetConfigFlags(FLAG_WINDOW_RESIZABLE); + InitWindow(SCREEN_W, SCREEN_H, "tiled"); + + Tiled tiled = initTiled(tiledMap); + + while (!WindowShouldClose()) { + update(&tiled); + + if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) + modifyTile(&tiled, 1); + + if (IsMouseButtonPressed(MOUSE_BUTTON_RIGHT)) + modifyTile(&tiled, -1); + + BeginDrawing(); + + ClearBackground(LIGHTGRAY); + + drawTiled(&tiled); + drawOverlay(tiled); + DrawFPS(16, 16); + + EndDrawing(); + } + + unloadTiled(&tiled); + + CloseWindow(); + return 0; +} + +int main() { + TiledMap tiledMap = loadTiledMap("map.tiles"); + launchEditor(tiledMap); +} diff --git a/src/tiled.c b/src/tiled.c index 49f957f..82b29e0 100644 --- a/src/tiled.c +++ b/src/tiled.c @@ -3,9 +3,6 @@ #include "tiled.h" -#define SCREEN_W 1280 -#define SCREEN_H 720 - void updateCamera(Vector2 *offset, float *zoom) { if (IsKeyDown(KEY_UP)) offset->y += 16.0f / *zoom; if (IsKeyDown(KEY_DOWN)) offset->y -= 16.0f/ *zoom; @@ -16,8 +13,8 @@ void updateCamera(Vector2 *offset, float *zoom) { if (IsKeyDown(KEY_S)) *zoom -= *zoom * 0.01f; } -void drawOverlay() { - DrawText(TextFormat("FPS: %d", GetFPS()), 12, 12, 24, DARKGRAY); +void updateTiledCamera(Tiled *tiled) { + updateCamera(&tiled->offset, &tiled->zoom); } @@ -34,24 +31,41 @@ void initTiledShader(Tiled *tiled) { tiled->tilemapTextureLoc = GetShaderLocation(tiled->shader, "tilemapTexture"); } -void initTiled(Tiled *tiled, TiledMap tiledMap) { - tiled->offset = (Vector2) {0, 0}; - tiled->zoom = 64; - tiled->mapSize[0] = tiled->tilemapTexture.width; - tiled->mapSize[1] = tiled->tilemapTexture.height; - tiled->targetTexture = LoadRenderTexture(1, 1); +Vector2 translateTiledPosition(Tiled tiled, Vector2 screenPos) { + return (Vector2) { + screenPos.x / tiled.zoom - tiled.offset.x, + screenPos.y / tiled.zoom - tiled.offset.y + }; +} + +Vector2 translateTiledScreenPosition(Tiled tiled, Vector2 tiledPos) { + return (Vector2) { + (tiledPos.x + tiled.offset.x) * tiled.zoom, + (tiledPos.y + tiled.offset.y) * tiled.zoom + }; +} + +Tiled initTiled(TiledMap tiledMap) { + Tiled tiled; + tiled.tiledMap = tiledMap; + tiled.offset = (Vector2) {0, 0}; + tiled.zoom = 64; + tiled.mapSize[0] = tiled.tilemapTexture.width; + tiled.mapSize[1] = tiled.tilemapTexture.height; + tiled.targetTexture = LoadRenderTexture(1, 1); - tiled->atlasSize[0] = tiledMap.atlasSize[0]; - tiled->atlasSize[1] = tiledMap.atlasSize[1]; + tiled.atlasSize[0] = tiledMap.atlasSize[0]; + tiled.atlasSize[1] = tiledMap.atlasSize[1]; - textureFromPixels(&tiled->atlasTexture, + textureFromPixels(&tiled.atlasTexture, tiledMap.atlasData, tiledMap.atlasSize[0] * tiledMap.tileSize, tiledMap.atlasSize[1] * tiledMap.tileSize); - renderTilemapTexture(&tiled->tilemapTexture, tiledMap); - initTiledShader(tiled); + renderTilemapTexture(&tiled.tilemapTexture, tiled.tiledMap); + initTiledShader(&tiled); + return tiled; } void setTiledShaderUniforms(Tiled tiled) { @@ -73,8 +87,6 @@ void unloadTiled(Tiled *tiled) { } void drawTiled(Tiled *tiled) { - updateCamera(&tiled->offset, &tiled->zoom); - BeginShaderMode(tiled->shader); setTiledShaderUniforms(*tiled); @@ -85,24 +97,22 @@ void drawTiled(Tiled *tiled) { EndShaderMode(); } -int main() { +int launchTiledView() { SetConfigFlags(FLAG_WINDOW_RESIZABLE); InitWindow(SCREEN_W, SCREEN_H, "tiled"); - Tiled tiled; TiledMap tiledMap = loadTiledMap("map.tiles"); - initTiled(&tiled, tiledMap); - - + Tiled tiled = initTiled(tiledMap); while (!WindowShouldClose()) { + updateTiledCamera(&tiled); BeginDrawing(); ClearBackground(LIGHTGRAY); drawTiled(&tiled); - drawOverlay(); + DrawFPS(16, 16); EndDrawing(); } diff --git a/src/tiled.h b/src/tiled.h index f496dc6..e1f1c79 100644 --- a/src/tiled.h +++ b/src/tiled.h @@ -2,7 +2,11 @@ #include "tiledfile.h" +#define SCREEN_W 1280 +#define SCREEN_H 720 + typedef struct Tiled { + TiledMap tiledMap; float zoom; Vector2 offset; @@ -26,6 +30,9 @@ typedef struct Tiled { } Tiled; -void initTiled(Tiled *tiled, TiledMap tiledMap); +void updateTiledCamera(Tiled *tiled); +Vector2 translateTiledPosition(Tiled tiled, Vector2 screenPos); +Vector2 translateTiledScreenPosition(Tiled tiled, Vector2 tiledPos); +Tiled initTiled(TiledMap tiledMap); void drawTiled(Tiled *tiled); void unloadTiled(Tiled *tiled); diff --git a/src/tiledfile.c b/src/tiledfile.c index d6d4b1b..bf0a828 100644 --- a/src/tiledfile.c +++ b/src/tiledfile.c @@ -30,6 +30,7 @@ void renderTilemapTexture(Texture2D *texOut, TiledMap tiledMap) { textureFromPixels(texOut, pixels, tiledMap.width, tiledMap.height); } + //! read rgba image from file void readrgba(Texture2D *loc, int width, int height, FILE *file) { Color *pixels = malloc(width*height*4); @@ -57,6 +58,14 @@ int readb(char * out, size_t noBytes, FILE * file) { return 0; } +char getTiledMapTile(TiledMap tiledMap, int pos[2]) { + return tiledMap.tilelayout[pos[1]*tiledMap.width + pos[0]]; +} + +void setTiledMapTile(TiledMap tiledMap, int pos[2], char tile) { + tiledMap.tilelayout[pos[1]*tiledMap.width + pos[0]] = tile; +} + //! load tilemap data from file TiledMap loadTiledMap(char * filename) { TiledMap tiledMap; diff --git a/src/tiledfile.h b/src/tiledfile.h index 929dabc..906bfdc 100644 --- a/src/tiledfile.h +++ b/src/tiledfile.h @@ -13,4 +13,8 @@ void textureFromPixels(Texture2D *texOut, Color *pixels, int width, int height); void renderTilemapTexture(Texture2D *texOut, TiledMap tiledMap); +void setTiledMapTile(TiledMap tiledMap, int pos[2], char tile); + +char getTiledMapTile(TiledMap tiledMap, int pos[2]); + TiledMap loadTiledMap(char * filename); |