From b2a62629642682792a02b60e68fcb741e38ab151 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 10 Jul 2025 00:12:32 -0400 Subject: [PATCH] Now have background color for the sprites used in the maps. --- assets/map_tiles.json | 58 +++++++++++++++++++++--------------------- assets/map_tiles.png | Bin 6289 -> 2984 bytes assets/tiles.json | 20 ++++++--------- tests/map.cpp | 29 +++++++++++++-------- tools/icongen.cpp | 22 +++++++++++++--- 5 files changed, 75 insertions(+), 54 deletions(-) diff --git a/assets/map_tiles.json b/assets/map_tiles.json index 5106a93..545e8ed 100644 --- a/assets/map_tiles.json +++ b/assets/map_tiles.json @@ -8,121 +8,121 @@ { "centered": false, "display": 35, - "x": 64, + "x": 32, "y": 0 }, { "centered": false, "display": 10398, - "x": 128, + "x": 64, "y": 0 }, { "centered": false, "display": 35, - "x": 192, + "x": 96, "y": 0 }, { "centered": false, "display": 35, - "x": 256, + "x": 128, "y": 0 }, { "centered": false, "display": 8820, - "x": 320, + "x": 160, "y": 0 }, { "centered": false, "display": 9608, - "x": 384, + "x": 192, "y": 0 }, { "centered": false, "display": 35, - "x": 448, + "x": 224, "y": 0 }, { "centered": true, "display": 1003, - "x": 512, + "x": 256, "y": 0 }, { "centered": true, "display": 3848, - "x": 576, + "x": 288, "y": 0 }, { "centered": true, "display": 85, "x": 0, - "y": 64 + "y": 32 }, { "centered": true, "display": 8687, - "x": 64, - "y": 64 + "x": 32, + "y": 32 }, { "centered": true, "display": 10949, - "x": 128, - "y": 64 + "x": 64, + "y": 32 }, { "centered": true, "display": 8793, - "x": 192, - "y": 64 + "x": 96, + "y": 32 }, { "centered": true, "display": 95, - "x": 256, - "y": 64 + "x": 128, + "y": 32 }, { "centered": true, "display": 1898, - "x": 320, - "y": 64 + "x": 160, + "y": 32 }, { "centered": true, "display": 2189, - "x": 384, - "y": 64 + "x": 192, + "y": 32 }, { "centered": true, "display": 2189, - "x": 448, - "y": 64 + "x": 224, + "y": 32 }, { "centered": true, "display": 42603, - "x": 512, - "y": 64 + "x": 256, + "y": 32 }, { "centered": true, "display": 2220, - "x": 576, - "y": 64 + "x": 288, + "y": 32 }, { "centered": true, "display": 1218, "x": 0, - "y": 128 + "y": 64 } ] diff --git a/assets/map_tiles.png b/assets/map_tiles.png index dcf893e3a4cfcd874e0b881e6d4dab023763f09d..fc25b4aec6305351ccf89f106383dd3c8e2bcfcf 100644 GIT binary patch literal 2984 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 literal 6289 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 Yz3imRva-a$KQ#d6J1utH-R>CrKaSC2WdHyG diff --git a/assets/tiles.json b/assets/tiles.json index 05fda6d..d6b1694 100644 --- a/assets/tiles.json +++ b/assets/tiles.json @@ -6,7 +6,6 @@ "ceiling": "ceiling_black", "light": 0, "foreground": [40, 40, 40], - "background": [10, 10, 10], "id": 0 }, "wall_plain": { @@ -23,8 +22,8 @@ "collision": true, "display": 8820, "light": 20, - "foreground": [150, 255, 150], - "background": [10, 10, 10], + "foreground": [100, 150, 100], + "background": [100, 100, 100], "id": 2 }, "ceiling_black": { @@ -32,8 +31,7 @@ "collision": false, "display": 35, "light": 0, - "foreground": [150, 150, 150], - "background": [10, 10, 10], + "foreground": [100, 100, 100], "id": 4 }, "lava_floor": { @@ -42,7 +40,7 @@ "display": 35, "ceiling": "ceiling_black", "light": 20, - "foreground": [255, 0, 0], + "foreground": [200, 100, 100], "background": [10, 10, 10], "id": 5 }, @@ -52,8 +50,7 @@ "display": 35, "ceiling": "ceiling_blue_light", "light": 40, - "foreground": [150, 150, 150], - "background": [10, 10, 10], + "foreground": [40, 40, 40], "id": 6 }, "ceiling_blue_light": { @@ -61,8 +58,7 @@ "collision": false, "display": 35, "light": 0, - "foreground": [150, 150, 150], - "background": [10, 10, 10], + "foreground": [100, 100, 100], "id": 7 }, "wood_wall": { @@ -70,8 +66,8 @@ "collision": false, "display": 35, "light": 0, - "foreground": [250, 250, 150], - "background": [10, 10, 10], + "foreground": [70, 70, 70], + "background": [100, 100, 100], "id": 8 } } diff --git a/tests/map.cpp b/tests/map.cpp index 750f7d0..47f1ea0 100644 --- a/tests/map.cpp +++ b/tests/map.cpp @@ -80,6 +80,13 @@ TEST_CASE("dijkstra algo test", "[map]") { } } +sf::Sprite render_sprite(std::unordered_map& sprite_coord, sf::Vector2i size, wchar_t display, sf::Texture& map_sprites) { + auto coords = sprite_coord.at(display); + sf::IntRect square{coords, {size.x, size.y}}; + sf::Sprite sprite{map_sprites, square}; + return sprite; +} + TEST_CASE("map image test", "[map-sprite]") { components::init(); @@ -89,7 +96,7 @@ TEST_CASE("map image test", "[map-sprite]") { auto &walls = level.map->tiles(); auto &tile_set = textures::get_map_tile_set(); - sf::Vector2i size{64,64}; + sf::Vector2i size{32,32}; matrix::dump("TILES?", walls); std::unordered_map sprite_coord; @@ -109,29 +116,31 @@ TEST_CASE("map image test", "[map-sprite]") { (unsigned int)matrix::height(walls) * size.y}; sf::RenderTexture render{dim}; - render.clear({50,50,50,255}); + render.clear({0,0,0,0}); sf::Texture map_sprites{"./assets/map_tiles.png"}; + sf::Texture paper{"./assets/ui/full_screen_paper.png"}; + sf::Sprite paper_sprite{paper}; + paper_sprite.scale({1.5f, 1.5f}); + paper_sprite.setPosition({-30.0f, -30.0f}); + render.draw(paper_sprite); 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.x, size.y}}; - sf::Sprite sprite{map_sprites, square}; - // sprite.setColor({150,150,150,255}); + auto sprite = render_sprite(sprite_coord, size, display, map_sprites); sprite.setPosition({float(it.x * size.x), float(it.y * size.y)}); + sprite.setColor({255, 255, 255, 200}); render.draw(sprite); } - level.world->query([&](auto, auto &pos, auto &entity_glyph) { REQUIRE(sprite_coord.contains(entity_glyph.display)); - auto coords = sprite_coord.at(entity_glyph.display); - sf::IntRect square{coords, {size.x, size.y}}; - sf::Sprite sprite{map_sprites, square}; + + auto sprite = render_sprite(sprite_coord, size, entity_glyph.display, map_sprites); + sprite.setColor({255,150,150,255}); sprite.setPosition({float(pos.location.x * size.x), float(pos.location.y * size.y)}); render.draw(sprite); diff --git a/tools/icongen.cpp b/tools/icongen.cpp index 1bc62cc..7188328 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=64; +constexpr const size_t DEFAULT_DIM=32; using namespace shiterator; @@ -26,6 +26,7 @@ struct MapConfig { MapGrid map = make(TILE_COUNT, TILE_COUNT); BoolGrid centered = make(TILE_COUNT, TILE_COUNT); std::unordered_map colors; + std::unordered_map backgrounds; each_row_t it{map}; }; @@ -86,6 +87,7 @@ struct MapTileBuilder { $render->setSmooth(false); sf::Vector2f cell_pos{0.0f,0.0f}; + sf::RectangleShape background({(float)$size.x, (float)$size.y}); for(each_row_t it{config.map}; it.next();) { // a 0 slot means we're done @@ -112,6 +114,9 @@ struct MapTileBuilder { dbc::check($size.x - t_size.x >= 0, "font too big on x"); dbc::check($size.y - t_size.y >= 0, "font too big on y"); + // draw the background first + background.setFillColor(config.backgrounds[display_char]); + if(is_centered) { sf::Vector2f center{ float(($size.x - t_size.x) / 2), @@ -123,10 +128,12 @@ struct MapTileBuilder { sf::Vector2f scale{float($size.x) / float(t_size.x), float($size.y) / float(t_size.y)}; sprite.setScale(scale); sprite.setPosition(cell_pos); + background.setPosition(cell_pos); } sprite.setColor(config.colors[display_char]); + $render->draw(background); $render->draw(sprite); } @@ -170,9 +177,18 @@ void load_config(MapConfig& config, bool is_centered, std::string path, std::fun sf::Color fg{fg_color[0], fg_color[1], fg_color[2]}; config.colors.insert_or_assign(display, fg); } else { - sf::Color fg{255, 100, 100}; - config.colors.insert_or_assign(display, fg); + config.colors.insert_or_assign(display, DEFAULT_COLOR); + } + + if(val.contains("background")) { + auto bg_color = val["background"]; + sf::Color bg{bg_color[0], bg_color[1], bg_color[2]}; + config.backgrounds.insert_or_assign(display, bg); + } else { + sf::Color bg{0, 0, 0, 0}; + config.backgrounds.insert_or_assign(display, bg); } + } }