From 2c011079a8f3dd5e0461a425af1322bb49759dcc Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Wed, 9 Jul 2025 01:54:49 -0400 Subject: [PATCH] I have a test now that can generate a map image so I'll make it look nice there before bringing the code into the game. --- Makefile | 6 ++--- assets/map_tiles.json | 58 +++++++++++++++++++++--------------------- assets/map_tiles.png | Bin 15380 -> 5647 bytes systems.cpp | 2 +- systems.hpp | 4 +-- tests/map.cpp | 53 ++++++++++++++++++++++++++++++++++++++ tools/icongen.cpp | 2 +- 7 files changed, 89 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index e885866..4384648 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ tracy_build: meson compile -j 10 -C builddir test: build - ./builddir/runtests + ./builddir/runtests "[map-sprite]" run: build test ifeq '$(OS)' 'Windows_NT' @@ -45,7 +45,7 @@ else endif debug: build - gdb --nx -x .gdbinit --ex run --args builddir/icongen + gdb --nx -x .gdbinit --ex run --args builddir/zedcaster debug_run: build gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args builddir/zedcaster @@ -57,7 +57,7 @@ clean: meson compile --clean -C builddir debug_test: build - gdb --nx -x .gdbinit --ex run --args builddir/runtests -e + gdb --nx -x .gdbinit --ex run --args builddir/runtests -e "[map-sprite]" win_installer: powershell 'start "C:\Program Files (x86)\solicus\InstallForge\bin\ifbuilderenvx86.exe" scripts\win_installer.ifp' diff --git a/assets/map_tiles.json b/assets/map_tiles.json index 01f47c2..5106a93 100644 --- a/assets/map_tiles.json +++ b/assets/map_tiles.json @@ -8,121 +8,121 @@ { "centered": false, "display": 35, - "x": 128, + "x": 64, "y": 0 }, { "centered": false, "display": 10398, - "x": 256, + "x": 128, "y": 0 }, { "centered": false, "display": 35, - "x": 384, + "x": 192, "y": 0 }, { "centered": false, "display": 35, - "x": 512, + "x": 256, "y": 0 }, { "centered": false, "display": 8820, - "x": 640, + "x": 320, "y": 0 }, { "centered": false, "display": 9608, - "x": 768, + "x": 384, "y": 0 }, { "centered": false, "display": 35, - "x": 896, + "x": 448, "y": 0 }, { "centered": true, "display": 1003, - "x": 1024, + "x": 512, "y": 0 }, { "centered": true, "display": 3848, - "x": 1152, + "x": 576, "y": 0 }, { "centered": true, "display": 85, "x": 0, - "y": 128 + "y": 64 }, { "centered": true, "display": 8687, - "x": 128, - "y": 128 + "x": 64, + "y": 64 }, { "centered": true, "display": 10949, - "x": 256, - "y": 128 + "x": 128, + "y": 64 }, { "centered": true, "display": 8793, - "x": 384, - "y": 128 + "x": 192, + "y": 64 }, { "centered": true, "display": 95, - "x": 512, - "y": 128 + "x": 256, + "y": 64 }, { "centered": true, "display": 1898, - "x": 640, - "y": 128 + "x": 320, + "y": 64 }, { "centered": true, "display": 2189, - "x": 768, - "y": 128 + "x": 384, + "y": 64 }, { "centered": true, "display": 2189, - "x": 896, - "y": 128 + "x": 448, + "y": 64 }, { "centered": true, "display": 42603, - "x": 1024, - "y": 128 + "x": 512, + "y": 64 }, { "centered": true, "display": 2220, - "x": 1152, - "y": 128 + "x": 576, + "y": 64 }, { "centered": true, "display": 1218, "x": 0, - "y": 256 + "y": 128 } ] diff --git a/assets/map_tiles.png b/assets/map_tiles.png index 56e5c516c23fe92f32c482591e758cd42ba8f1c7..b024baaa028f27c38e8062a45ab0757e795285e2 100644 GIT binary patch literal 5647 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 X@`iZz&bjcS7fkOVz?vNP|HM7^J`WkFHJK~ndZ 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 sprite_effect(GameLevel &level, Entity entity); void player_status(GameLevel &level); diff --git a/tests/map.cpp b/tests/map.cpp index 5e2b1cb..436924b 100644 --- a/tests/map.cpp +++ b/tests/map.cpp @@ -15,6 +15,7 @@ json load_test_data(const string &fname) { } TEST_CASE("camera control", "[map]") { + textures::init(); components::init(); LevelManager levels; GameLevel level = levels.current(); @@ -33,6 +34,7 @@ TEST_CASE("camera control", "[map]") { } TEST_CASE("map placement test", "[map:placement]") { + textures::init(); components::init(); for(int i = 0; i < 20; i++) { LevelManager levels; @@ -51,6 +53,7 @@ TEST_CASE("map placement test", "[map:placement]") { } TEST_CASE("dijkstra algo test", "[map]") { + textures::init(); json data = load_test_data("./tests/dijkstra.json"); for(auto &test : data) { @@ -76,3 +79,53 @@ TEST_CASE("dijkstra algo test", "[map]") { // FIX ME: REQUIRE(paths == expected); } } + + +TEST_CASE("map image test", "[map-sprite]") { + components::init(); + textures::init(); + LevelManager levels; + GameLevel level = levels.current(); + auto &walls = level.map->tiles(); + auto &tile_set = textures::get_map_tile_set(); + + sf::Vector2i size{64,64}; + matrix::dump("TILES?", walls); + + std::unordered_map sprite_coord; + + Config config("./assets/map_tiles.json"); + json& tiles = config.json(); + + for(auto tile : tiles) { + sf::Vector2i coords{tile["x"], tile["y"]}; + sprite_coord.insert_or_assign(tile["display"], coords); + } + + sf::Vector2u dim{ + (unsigned int)matrix::width(walls) * size.x, + (unsigned int)matrix::height(walls) * size.y}; + + sf::RenderTexture render{dim}; + render.clear({50,50,50,255}); + + sf::Texture map_sprites{"./assets/map_tiles.png"}; + + for(matrix::each_row it{walls}; it.next();) { + size_t tid = walls[it.y][it.x]; + wchar_t display = tile_set[tid]; + REQUIRE(sprite_coord.contains(display)); + + auto coords = sprite_coord.at(display); + sf::IntRect square{coords, size}; + sf::Sprite sprite{map_sprites, square}; + sprite.setColor({150,150,150,255}); + sprite.setPosition({float(it.x) * float(size.x), float(it.y) * float(size.y)}); + render.draw(sprite); + } + + render.display(); + sf::Image out_img = render.getTexture().copyToImage(); + bool worked = out_img.saveToFile("map_test.png"); + REQUIRE(worked); +} diff --git a/tools/icongen.cpp b/tools/icongen.cpp index c285d9a..aaf2ca5 100644 --- a/tools/icongen.cpp +++ b/tools/icongen.cpp @@ -12,7 +12,7 @@ namespace fs = std::filesystem; constexpr const int TILE_COUNT=10; constexpr const sf::Color DEFAULT_COLOR{255, 255, 255, 255}; -constexpr const size_t DEFAULT_DIM=128; +constexpr const size_t DEFAULT_DIM=64; using namespace shiterator;