From 8a7ca839fa371162c3064801d9b454530f654f15 Mon Sep 17 00:00:00 2001 From: Alexey Bagno Date: Fri, 21 Aug 2026 19:48:16 +0500 Subject: [PATCH] Map parsing --- Tiled/Map.tsx | 4 ++ Tiled/hello.tiled-session | 36 +++++++++- Tiled/безымянный.json | 113 +++++++++++++++++++++++++++++++ Tiled/безымянный.tmx | 76 +++++++++++++++++++++ main.odin | 89 ++++++++++++------------ map.odin | 22 ++++-- test/main.odin | 0 test/test2/test/main.odin | 0 tiled_parser.odin | 139 ++++++++++++++++++++++++++++++++++++++ 9 files changed, 426 insertions(+), 53 deletions(-) create mode 100644 Tiled/Map.tsx create mode 100644 Tiled/безымянный.json create mode 100644 Tiled/безымянный.tmx create mode 100644 test/main.odin create mode 100644 test/test2/test/main.odin create mode 100644 tiled_parser.odin diff --git a/Tiled/Map.tsx b/Tiled/Map.tsx new file mode 100644 index 0000000..0b4ef26 --- /dev/null +++ b/Tiled/Map.tsx @@ -0,0 +1,4 @@ + + + + diff --git a/Tiled/hello.tiled-session b/Tiled/hello.tiled-session index e0d9b11..efc04bf 100644 --- a/Tiled/hello.tiled-session +++ b/Tiled/hello.tiled-session @@ -1,12 +1,44 @@ { - "activeFile": "", + "Map/SizeTest": { + "height": 4300, + "width": 2 + }, + "activeFile": "безымянный.tmx", "expandedProjectPaths": [ ], + "file.lastUsedOpenFilter": "Все файлы (*)", "fileStates": { + "Map.tsx": { + "scaleInDock": 1, + "scaleInEditor": 1 + }, + "безымянный.tmx": { + "scale": 1.6605208333333332, + "selectedLayer": 2, + "viewCenter": { + "x": 240.2860548271752, + "y": 159.88959287372188 + } + } }, + "last.exportedFilePath": "/Users/aleksejbagno/projects/odin/hello/Tiled", + "last.imagePath": "/Users/aleksejbagno/projects/odin/hello/assets/3rdparty/tileset/Tiles", + "map.lastUsedExportFilter": "JSON map-файлы (*.tmj *.json)", + "map.lastUsedFormat": "tmx", + "map.tileHeight": 16, + "map.tileWidth": 16, "openFiles": [ + "безымянный.tmx", + "Map.tsx" ], "project": "hello.tiled-project", "recentFiles": [ - ] + "Map.tsx", + "безымянный.tmx" + ], + "tileset.lastUsedFormat": "tsx", + "tileset.tileSize": { + "height": 16, + "width": 16 + } } diff --git a/Tiled/безымянный.json b/Tiled/безымянный.json new file mode 100644 index 0000000..07d90c5 --- /dev/null +++ b/Tiled/безымянный.json @@ -0,0 +1,113 @@ +{ "compressionlevel":-1, + "height":20, + "infinite":false, + "layers":[ + { + "data":[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 14, 10, 10, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 22, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 14, 22, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], + "height":20, + "id":1, + "name":"\u0421\u043b\u043e\u0439 \u0442\u0430\u0439\u043b\u043e\u0432 1", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "data":[64, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 63, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 29, 29, 29, 30, 0, 0, 60, + 62, 0, 84, 85, 85, 85, 85, 85, 85, 85, 85, 85, 86, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 38, 0, 0, 60, + 62, 0, 92, 90, 112, 90, 120, 120, 111, 90, 111, 90, 94, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 38, 0, 0, 60, + 62, 0, 92, 90, 90, 87, 101, 101, 101, 101, 101, 101, 102, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 45, 39, 0, 38, 0, 0, 60, + 62, 0, 92, 119, 90, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 45, 46, 0, 0, 60, + 62, 0, 92, 90, 90, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 100, 101, 101, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 34, 34, 34, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 34, 34, 34, 34, 34, 27, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 34, 34, 34, 34, 34, 34, 34, 27, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 34, 34, 34, 34, 34, 34, 35, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 34, 34, 34, 34, 34, 34, 35, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 34, 34, 34, 34, 34, 34, 34, 43, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 34, 34, 34, 34, 43, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 81, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 34, 34, 34, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 42, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 97, 98, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, + 56, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 55], + "height":20, + "id":2, + "name":"\u0421\u043b\u043e\u0439 \u0442\u0430\u0439\u043b\u043e\u0432 2", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 7, 0, 7, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 7, 7, 0, 7, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 7, 0, 0, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":20, + "id":3, + "name":"\u0421\u043b\u043e\u0439 \u0442\u0430\u0439\u043b\u043e\u0432 3", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }], + "nextlayerid":4, + "nextobjectid":1, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":16, + "tilesets":[ + { + "firstgid":1, + "source":"Map.tsx" + }], + "tilewidth":16, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file diff --git a/Tiled/безымянный.tmx b/Tiled/безымянный.tmx new file mode 100644 index 0000000..e58009e --- /dev/null +++ b/Tiled/безымянный.tmx @@ -0,0 +1,76 @@ + + + + + +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,6,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,14,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,14,10,10,14,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,14,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,14,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,22,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,14,10,10,10,10,14,22,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,14,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, +10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10 + + + + +64,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,69,63, +62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,29,29,29,29,30,0,0,60, +62,0,84,85,85,85,85,85,85,85,85,85,86,0,0,0,0,0,0,0,0,36,0,0,0,0,38,0,0,60, +62,0,92,90,112,90,120,120,111,90,111,90,94,0,0,0,0,0,0,0,0,36,0,0,0,0,38,0,0,60, +62,0,92,90,90,87,101,101,101,101,101,101,102,0,0,0,0,0,0,0,0,44,45,45,39,0,38,0,0,60, +62,0,92,119,90,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,45,46,0,0,60, +62,0,92,90,90,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60, +62,0,100,101,101,102,0,0,0,0,0,0,0,0,0,0,25,26,27,0,0,0,0,0,0,0,0,0,0,60, +62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,34,34,34,27,0,0,0,0,0,0,0,0,0,60, +62,0,0,0,0,0,0,0,0,0,0,0,0,0,25,34,34,34,34,34,27,0,0,0,0,0,0,0,0,60, +62,0,0,0,0,0,0,0,0,0,0,0,0,25,34,34,34,34,34,34,34,27,0,0,0,0,0,0,0,60, +62,0,0,0,0,0,0,0,0,0,0,0,0,33,34,34,34,34,34,34,34,35,0,0,0,0,0,0,0,60, +62,0,0,0,0,0,0,0,0,0,0,0,0,33,34,34,34,34,34,34,34,35,0,0,0,0,0,0,0,60, +62,0,0,0,0,0,0,0,0,0,0,0,0,41,34,34,34,34,34,34,34,43,0,0,0,0,0,0,0,60, +62,0,0,0,0,0,0,0,0,0,0,0,0,0,33,34,34,34,34,34,43,0,0,0,0,0,0,0,0,60, +62,0,0,81,82,83,0,0,0,0,0,0,0,0,33,34,34,34,34,43,0,0,0,0,0,0,0,0,0,60, +62,0,0,89,90,91,0,0,0,0,0,0,0,0,41,42,42,42,43,0,0,0,0,0,0,0,0,0,0,60, +62,0,0,97,98,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60, +62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60, +56,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,53,55 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,7,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7,0,0,0,7,0,7,0,7,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,7,0,7,0,0,0,7,7,0,7,0,0,7,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,7,0,7,0,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,7,0,7,0,0,0,7,0,0,7,7,0,0,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,7,0,0,0,7,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + diff --git a/main.odin b/main.odin index 1817ac9..d80d352 100644 --- a/main.odin +++ b/main.odin @@ -1,5 +1,6 @@ package main +import "base:runtime" import hm "core:container/handle_map" import "core:fmt" import rl "vendor:raylib" @@ -34,6 +35,8 @@ create_scene :: proc() -> Scene { offset = rl.Vector2{SCREEN_W / 2, SCREEN_H / 2}, }, } + + // _ = hm.add( // &scene.enemies, // Enemy { @@ -72,7 +75,7 @@ draw_scene :: proc(scene: ^Scene) { 0, 0, cast(f32)scene.map_tex.texture.width, - cast(f32)scene.map_tex.texture.height, + -cast(f32)scene.map_tex.texture.height, // FIX: flip Y axis }, rl.Rectangle { 0, @@ -107,51 +110,33 @@ draw_scene :: proc(scene: ^Scene) { rl.EndMode2D() } -render_map :: proc(atlas: ^Atlas) -> rl.RenderTexture2D { - map_data := [16][16]i32 { - {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10}, - {16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18}, - } - width := i32(atlas.tile_size.x) * 16 - height := i32(atlas.tile_size.y) * 16 - tex := rl.LoadRenderTexture(width, height) +render_map :: proc(atlas: ^Atlas, map_data: Map) -> rl.RenderTexture2D { + tex := rl.LoadRenderTexture(map_data.width * 16, map_data.height * 16) rl.BeginTextureMode(tex) - for row, i in map_data { - for col, j in row { - offset := get_offset(atlas, col) - fmt.printf("offset: %v, frame: %v\n", offset, col) - rl.DrawTexturePro( - atlas^.tex, - rl.Rectangle { - offset.x, - offset.y, - atlas.tile_size.x, - atlas.tile_size.y, - }, - rl.Rectangle { - f32(j) * atlas.tile_size.x, - f32(i) * atlas.tile_size.y, - atlas.tile_size.x, - atlas.tile_size.y, - }, - rl.Vector2{0, 0}, - 0, - rl.WHITE, - ) + for layer in map_data.layers { + for row_data, row in layer.data { + for tile_id, col in row_data { + offset, empty := get_offset(atlas, tile_id) + if empty do continue + rl.DrawTexturePro( + atlas^.tex, + rl.Rectangle { + offset.x, + offset.y, + atlas.tile_size.x, + atlas.tile_size.y, + }, + rl.Rectangle { + f32(col) * atlas.tile_size.x, + f32(row) * atlas.tile_size.y, + atlas.tile_size.x, + atlas.tile_size.y, + }, + rl.Vector2{0, 0}, + 0, + rl.WHITE, + ) + } } } rl.EndTextureMode() @@ -183,9 +168,21 @@ main :: proc() { defer rl.CloseWindow() rl.SetTargetFPS(60) + + arena: runtime.Arena + defer runtime.arena_destroy(&arena) + + arena_alloc := runtime.arena_allocator(&arena) + + map_data, err := load_map( + "./Tiled/безымянный.json", + arena_alloc, + ) + if err.type != .None do fmt.println(err.msg) + //WARN: Add a destructor to free (handlemap dangling) scene := create_scene() - scene.map_tex = render_map(&scene.atlas) + scene.map_tex = render_map(&scene.atlas, map_data) for !rl.WindowShouldClose() { dt := rl.GetFrameTime() diff --git a/map.odin b/map.odin index bc42c0f..685ccca 100644 --- a/map.odin +++ b/map.odin @@ -51,7 +51,8 @@ load_atlas :: proc() -> Atlas { draw_tile :: proc(tile: Tile) { - offset := get_offset(tile.atlas, tile.frame) + offset, empty := get_offset(tile.atlas, tile.frame) + if empty do return rl.DrawTexturePro( tile.atlas^.tex, rl.Rectangle { @@ -73,13 +74,24 @@ draw_tile :: proc(tile: Tile) { ) } -get_offset :: proc(atlas: ^Atlas, f: i32) -> rl.Vector2 { +get_offset :: proc( + atlas: ^Atlas, + f: i32, +) -> ( + offset: rl.Vector2, + empty: bool, +) { - col := f % atlas.cols - row := f / atlas.cols + if f == 0 do return {}, true - return rl.Vector2 { + col := (f - 1) % atlas.cols + row := (f - 1) / atlas.cols + + + offset = rl.Vector2 { f32(col) * atlas.tile_size.x, f32(row) * atlas.tile_size.y, } + + return } diff --git a/test/main.odin b/test/main.odin new file mode 100644 index 0000000..e69de29 diff --git a/test/test2/test/main.odin b/test/test2/test/main.odin new file mode 100644 index 0000000..e69de29 diff --git a/tiled_parser.odin b/tiled_parser.odin new file mode 100644 index 0000000..5710ded --- /dev/null +++ b/tiled_parser.odin @@ -0,0 +1,139 @@ +package main + +import "base:runtime" +import "core:encoding/json" +import "core:fmt" +import "core:os" + +Map_File :: struct { + compression_level: int `json:"compressionlevel"`, + height: int `json:"height"`, + infinite: bool `json:"infinite"`, + layers: []Layer `json:"layers"`, + next_layer_id: int `json:"nextlayerid"`, + next_object_id: int `json:"nextobjectid"`, + orientation: string `json:"orientation"`, + render_order: string `json:"renderorder"`, + tiled_version: string `json:"tiledversion"`, + tile_height: int `json:"tileheight"`, + tile_sets: []Tileset `json:"tilesets"`, + tile_width: int `json:"tilewidth"`, + type: string `json:"type"`, + version: string `json:"version"`, + width: int `json:"width"`, +} + +Layer :: struct { + data: []int `json:"data"`, + height: int `json:"height"`, + id: int `json:"id"`, + name: string `json:"name"`, + opacity: f32 `json:"opacity"`, + type: string `json:"type"`, + visible: bool `json:"visible"`, + width: int `json:"width"`, + x: int `json:"x"`, + y: int `json:"y"`, +} + +Tileset :: struct { + first_gid: int `json:"firstgid"`, + source: string `json:"source"`, +} + +Map_Load_Error_Type :: enum { + None, + Err_Loading_File, + Err_Unmarshal, +} + +Map_Load_Error :: struct { + type: Map_Load_Error_Type, + msg: string, +} + +Map :: struct { + width: i32, + height: i32, + layers: []Layer_Data, +} + +Layer_Data :: struct { + data: [][]i32, +} + +load_map :: proc( + path: string, + allocator: runtime.Allocator, +) -> ( + map_out: Map, + err: Map_Load_Error, +) { + + context.allocator = allocator + + cfg_data, os_err := os.read_entire_file(path, context.allocator) + if os_err != os.General_Error.None { + return {}, Map_Load_Error{type = .Err_Loading_File, msg = fmt.aprintf("Error reading file: %v (%v)", path, os_err)} + } + + unm_map: Map_File + unm_err := json.unmarshal(cfg_data, &unm_map) + if unm_err != nil { + return {}, Map_Load_Error{type = .Err_Unmarshal, msg = fmt.aprintf("Error unmarshalling file: %v (%v)\nOnly Tiled version 1.11.2 is supported", path, unm_err)} + } + + assert(!unm_map.infinite, "Infinite maps are not supported") + assert( + unm_map.orientation == "orthogonal", + "Only orthogonal maps are supported", + ) + assert( + unm_map.render_order == "right-down", + "Only right-down maps are supported", + ) + assert( + unm_map.tile_height == 16 && unm_map.tile_width == 16, + "Only 16x16 tiles are supported", + ) + + + if len(unm_map.layers) == 0 { + return {}, Map_Load_Error{type = .Err_Unmarshal, msg = fmt.aprintf("No layers found in file: %v", path)} + } + if len(unm_map.tile_sets) == 0 { + return {}, Map_Load_Error{type = .Err_Unmarshal, msg = fmt.aprintf("No tilesets found in file: %v", path)} + } + for layer in unm_map.layers { + assert( + layer.type == "tilelayer", + "Only layers with type 'tilelayer' are supported", + ) + } + + map_out.width = i32(unm_map.width) + map_out.height = i32(unm_map.height) + + + map_out.layers = make([]Layer_Data, len(unm_map.layers)) + for &out, li in map_out.layers { + src := unm_map.layers[li] + out.data = make([][]i32, src.height) + for row in 0 ..< src.height { + out.data[row] = make([]i32, src.width) + for col in 0 ..< src.width { + out.data[row][col] = i32(src.data[row * src.width + col]) + } + } + } + + // for layer in unm_map.layers { + // for tile, tile_id in layer.data { + // map_out.data[tile_id / layer.width][tile_id % layer.width] = i32( + // tile, + // ) + // } + // } + + return +}