From 04b3cf3f162ef7b2ada6415650cc361c27fdd2b6 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 8 Jul 2025 13:26:43 -0400 Subject: [PATCH] Now have a sprite sheet with tiles expanded to fill the cell, but other sprites reduced to 80% and centered in the cell. --- assets/map_tiles.png | Bin 5991 -> 6013 bytes tools/icongen.cpp | 43 ++++++++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/assets/map_tiles.png b/assets/map_tiles.png index 5c610aaf994a04c52b67a80e61413dfa6857229d..f342d63a706b17ec0ab5251dfa1d784b28ab6e83 100644 GIT binary patch literal 6013 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 literal 5991 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 Uzk1W)KhS|S?!Io9TzR5@16-Ae-T(jq diff --git a/tools/icongen.cpp b/tools/icongen.cpp index d57f8de..919a76e 100644 --- a/tools/icongen.cpp +++ b/tools/icongen.cpp @@ -16,6 +16,9 @@ using namespace shiterator; using MapRow = BaseRow; using MapGrid = Base; +using BoolRow = BaseRow; +using BoolGrid = Base; + struct MapTileBuilder { unsigned int $font_size = 20; sf::Glyph $glyph; @@ -41,8 +44,8 @@ struct MapTileBuilder { auto temp = $font.getGlyph(for_char, $font_size, false); auto temp_size = $font_size; - while(temp.textureRect.size.y < int($size.y)-1 - && temp.textureRect.size.x < int($size.x)-1) + while(temp.textureRect.size.y < int($size.y) + && temp.textureRect.size.x < int($size.x)) { $glyph = temp; $font_size = temp_size; @@ -66,7 +69,7 @@ struct MapTileBuilder { } - void run(MapGrid& map) { + void run(MapGrid& map, BoolGrid& centered) { sf::Vector2f cell_pos{0.0f,0.0f}; for(each_row_t it{map}; it.next();) { @@ -74,6 +77,7 @@ struct MapTileBuilder { if(map[it.y][it.x] == 0) continue; cell_pos.x = it.x * $size.x; cell_pos.y = it.y * $size.y; + bool is_centered = centered[it.y][it.x]; wchar_t display_char = map[it.y][it.x]; std::wstring content{display_char}; @@ -93,14 +97,21 @@ struct MapTileBuilder { dbc::check(int($size.x - t_size.x) > 0, "font too big on x"); dbc::check(int($size.y - t_size.y) > 0, "font too big on y"); - sf::Vector2f center{ - (float($size.x) - float(t_size.x)) / 2.0f, - (float($size.y) - float(t_size.y)) / 2.0f}; - sf::Vector2f scale{float($size.x) / float(t_size.x), float($size.y) / float(t_size.y)}; + if(is_centered) { + sf::Vector2f center{ + (float($size.x) - float(t_size.x)) / 2.0f, + (float($size.y) - float(t_size.y)) / 2.0f}; + + sf::Vector2f scale{float($size.x) / float(t_size.x) * 0.8f, float($size.y) / float(t_size.y) * 0.8f}; + sprite.setScale(scale); + sprite.setPosition({cell_pos.x + center.x, cell_pos.y + center.y}); + } else { + sf::Vector2f scale{float($size.x) / float(t_size.x), float($size.y) / float(t_size.y)}; + sprite.setScale(scale); + sprite.setPosition(cell_pos); + } - sprite.setScale(scale); - sprite.setPosition(cell_pos); sprite.setColor({0, 0, 0, 255}); $render.draw(sprite); @@ -110,13 +121,14 @@ struct MapTileBuilder { } }; -void load_config(MapGrid& map, each_row_t& it, std::string path, +void load_config(MapGrid& map, BoolGrid& centered, bool is_centered, each_row_t& it, std::string path, std::function finder) { Config tiles(path); for(auto [key, val] : tiles.json().items()) { it.next(); map[it.y][it.x] = finder(val); + centered[it.y][it.x] = is_centered; } } @@ -136,18 +148,19 @@ wchar_t component_display(nlohmann::json& val) { int main() { MapGrid map = make(TILE_COUNT, TILE_COUNT); + BoolGrid centered = make(TILE_COUNT, TILE_COUNT); each_row_t it{map}; - load_config(map, it, "./assets/tiles.json", [](nlohmann::json& val) -> wchar_t { + load_config(map, centered, false, it, "./assets/tiles.json", [](nlohmann::json& val) -> wchar_t { return val["display"]; }); - load_config(map, it, "./assets/items.json", component_display); - load_config(map, it, "./assets/devices.json", component_display); - load_config(map, it, "./assets/enemies.json", component_display); + load_config(map, centered, true, it, "./assets/items.json", component_display); + load_config(map, centered, true, it, "./assets/devices.json", component_display); + load_config(map, centered, true, it, "./assets/enemies.json", component_display); MapTileBuilder builder(32, 32); - builder.run(map); + builder.run(map, centered); builder.save_image("./assets/map_tiles.png"); return 0;