From dca38397e7b8dac1b8bf88d7c3219e76f2407fd9 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 15 Jul 2025 11:39:05 -0400 Subject: [PATCH] Systems::render_map now holds the logic to render the map, and it's working well enough to use for displaying. --- systems.cpp | 32 ++++++++++++++++++++++++++++++++ systems.hpp | 4 +++- tests/map.cpp | 49 ++++++++++--------------------------------------- 3 files changed, 45 insertions(+), 40 deletions(-) diff --git a/systems.cpp b/systems.cpp index a6b699e..db9c301 100644 --- a/systems.cpp +++ b/systems.cpp @@ -565,3 +565,35 @@ bool System::inventory_occupied(GameLevel& level, Entity container_id, const std auto& inventory = level.world->get(container_id); return inventory.has(name); } + + +void System::render_map(Matrix& tiles, EntityGrid& entity_map, sf::RenderTexture& render) { + sf::Vector2i size{MAP_TILE_DIM,MAP_TILE_DIM}; + unsigned int width = matrix::width(tiles); + unsigned int height = matrix::height(tiles); + sf::Vector2u dim{width * size.x, height * size.y}; + auto render_size = render.getSize(); + + if(render_size.x != width || render_size.y != height) { + bool worked = render.resize(dim); + dbc::check(worked, "Failed to resize map render target."); + } + + render.clear({0,0,0,0}); + + for(matrix::each_row it{tiles}; it.next();) { + wchar_t display = tiles[it.y][it.x]; + if(display == L' ') continue; // skip for now + auto& sprite = textures::get_map_sprite(display); + sprite.setPosition({float(it.x * size.x), float(it.y * size.y)}); + render.draw(sprite); + } + + for(auto [point, display] : entity_map) { + auto& sprite = textures::get_map_sprite(display); + sprite.setPosition({float(point.x * size.x), float(point.y * size.y)}); + render.draw(sprite); + } + + render.display(); +} diff --git a/systems.hpp b/systems.hpp index 8ae3f2b..943aea9 100644 --- a/systems.hpp +++ b/systems.hpp @@ -1,7 +1,7 @@ #pragma once #include "components.hpp" #include "levelmanager.hpp" - +#include namespace System { using namespace components; @@ -39,4 +39,6 @@ namespace System { Position& player_position(GameLevel& level); void inventory_swap(GameLevel &level, Entity container_id, const std::string& a_name, const std::string &b_name); bool inventory_occupied(GameLevel& level, Entity container_id, const std::string& name); + + void render_map(Matrix& tiles, EntityGrid& entity_map, sf::RenderTexture& render); } diff --git a/tests/map.cpp b/tests/map.cpp index 8bd4e3e..2ae63f1 100644 --- a/tests/map.cpp +++ b/tests/map.cpp @@ -6,6 +6,7 @@ #include "levelmanager.hpp" #include "systems.hpp" + using namespace fmt; using namespace nlohmann; using std::string; @@ -81,37 +82,6 @@ TEST_CASE("dijkstra algo test", "[map]") { } } -sf::Sprite render_map(Matrix& tiles, EntityGrid& entity_map, sf::RenderTexture& render) { - (void) entity_map; - sf::Vector2i size{MAP_TILE_DIM,MAP_TILE_DIM}; - - sf::Vector2u dim{ - (unsigned int)matrix::width(tiles) * size.x, - (unsigned int)matrix::height(tiles) * size.y}; - - bool worked = render.resize(dim); - dbc::check(worked, "Failed to resize map render target."); - - render.clear({0,0,0,0}); - - for(matrix::each_row it{tiles}; it.next();) { - wchar_t display = tiles[it.y][it.x]; - if(display == L' ') continue; // skip for now - auto& sprite = textures::get_map_sprite(display); - sprite.setPosition({float(it.x * size.x), float(it.y * size.y)}); - render.draw(sprite); - } - - for(auto [point, display] : entity_map) { - auto& sprite = textures::get_map_sprite(display); - sprite.setPosition({float(point.x * size.x), float(point.y * size.y)}); - render.draw(sprite); - } - - render.display(); - return sf::Sprite{render.getTexture()}; -} - TEST_CASE("map image test", "[map-sprite]") { components::init(); textures::init(); @@ -122,6 +92,7 @@ TEST_CASE("map image test", "[map-sprite]") { EntityGrid entity_map; auto render = std::make_shared(); + sf::Sprite sprite{render->getTexture()}; auto player = level.world->get_the(); auto& player_pos = level.world->get(player.entity); @@ -131,13 +102,13 @@ TEST_CASE("map image test", "[map-sprite]") { System::draw_map(level, map_tiles, entity_map, 2); // on level start make one render texture with the base map - auto map_sprite = render_map(map_tiles, entity_map, *render); + System::render_map(map_tiles, entity_map, *render); + +#ifdef TEST_RENDER + // confirm we get two different maps + auto out_img = render->getTexture().copyToImage(); + bool worked = out_img.saveToFile(fmt::format("tmp/map_render{}{}.png", it.x, it.y)); + REQUIRE(worked); +#endif } - - /* - // confirm we get two different maps - auto out_img = render->getTexture().copyToImage(); - bool worked = out_img.saveToFile("map_render.png"); - REQUIRE(worked); - */ }