Systems::render_map now holds the logic to render the map, and it's working well enough to use for displaying.

master
Zed A. Shaw 18 hours ago
parent 0d1eacdc5c
commit dca38397e7
  1. 32
      systems.cpp
  2. 4
      systems.hpp
  3. 49
      tests/map.cpp

@ -565,3 +565,35 @@ bool System::inventory_occupied(GameLevel& level, Entity container_id, const std
auto& inventory = level.world->get<inventory::Model>(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();
}

@ -1,7 +1,7 @@
#pragma once
#include "components.hpp"
#include "levelmanager.hpp"
#include <SFML/Graphics/RenderTexture.hpp>
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);
}

@ -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::RenderTexture>();
sf::Sprite sprite{render->getTexture()};
auto player = level.world->get_the<components::Player>();
auto& player_pos = level.world->get<components::Position>(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);
*/
}

Loading…
Cancel
Save