This cleans up how I'm rendering the map but there's no way I can render a large map like this. It'd be way too big.
This commit is contained in:
parent
3b06105813
commit
d9219a8c64
3 changed files with 74 additions and 42 deletions
|
@ -80,71 +80,71 @@ TEST_CASE("dijkstra algo test", "[map]") {
|
|||
}
|
||||
}
|
||||
|
||||
sf::Sprite render_sprite(std::unordered_map<wchar_t, sf::Vector2i>& 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();
|
||||
textures::init();
|
||||
LevelManager levels;
|
||||
GameLevel level = levels.current();
|
||||
sf::Sprite render_map(GameLevel& level, sf::RenderTexture& render) {
|
||||
auto &walls = level.map->tiles();
|
||||
|
||||
auto &tile_set = textures::get_map_tile_set();
|
||||
|
||||
sf::Vector2i size{MAP_TILE_DIM,MAP_TILE_DIM};
|
||||
matrix::dump("TILES?", walls);
|
||||
|
||||
std::unordered_map<wchar_t, sf::Vector2i> sprite_coord;
|
||||
|
||||
Config config("./assets/map_tiles.json");
|
||||
json& tiles = config.json();
|
||||
|
||||
for(auto tile : tiles) {
|
||||
sf::Vector2i coords{tile["x"], tile["y"]};
|
||||
REQUIRE(coords.x % size.x == 0);
|
||||
REQUIRE(coords.y % size.y == 0);
|
||||
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({0,0,0,0});
|
||||
bool worked = render.resize(dim);
|
||||
dbc::check(worked, "Failed to resize map render target.");
|
||||
|
||||
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);
|
||||
render.clear({0,0,0,0});
|
||||
|
||||
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 sprite = render_sprite(sprite_coord, size, display, map_sprites);
|
||||
auto& sprite = textures::get_map_sprite(display);
|
||||
sprite.setPosition({float(it.x * size.x), float(it.y * size.y)});
|
||||
render.draw(sprite);
|
||||
}
|
||||
|
||||
level.world->query<components::Position, components::Tile>([&](auto, auto &pos, auto &entity_glyph) {
|
||||
REQUIRE(sprite_coord.contains(entity_glyph.display));
|
||||
render.display();
|
||||
return sf::Sprite{render.getTexture()};
|
||||
}
|
||||
|
||||
auto sprite = render_sprite(sprite_coord, size, entity_glyph.display, map_sprites);
|
||||
sprite.setPosition({float(pos.location.x * size.x), float(pos.location.y * size.y)});
|
||||
sf::Sprite render_entities(GameLevel& level, sf::Sprite& map_sprite, sf::RenderTexture& render) {
|
||||
render.clear({0,0,0,0});
|
||||
render.draw(map_sprite);
|
||||
|
||||
level.world->query<components::Position, components::Tile>([&](auto, auto &pos, auto &entity_glyph) {
|
||||
auto sprite = textures::get_map_sprite(entity_glyph.display);
|
||||
sprite.setPosition({float(pos.location.x * MAP_TILE_DIM), float(pos.location.y * MAP_TILE_DIM)});
|
||||
render.draw(sprite);
|
||||
});
|
||||
|
||||
render.display();
|
||||
sf::Image out_img = render.getTexture().copyToImage();
|
||||
bool worked = out_img.saveToFile("map_test.png");
|
||||
return sf::Sprite{render.getTexture()};
|
||||
}
|
||||
|
||||
TEST_CASE("map image test", "[map-sprite]") {
|
||||
components::init();
|
||||
textures::init();
|
||||
|
||||
LevelManager levels;
|
||||
GameLevel level = levels.current();
|
||||
// on level start make one render texture with the base map
|
||||
auto render = std::make_shared<sf::RenderTexture>();
|
||||
auto map_sprite = render_map(level, *render);
|
||||
|
||||
// every turn render the map to the entities texture, then render
|
||||
// entities on this image, that way I just have to render them
|
||||
auto entities = std::make_shared<sf::RenderTexture>(render->getSize());
|
||||
render_entities(level, map_sprite, *entities);
|
||||
|
||||
// confirm we get two different maps
|
||||
auto out_img = render->getTexture().copyToImage();
|
||||
bool worked = out_img.saveToFile("map_render.png");
|
||||
REQUIRE(worked);
|
||||
|
||||
// this has entities on it
|
||||
out_img = entities->getTexture().copyToImage();
|
||||
worked = out_img.saveToFile("map_entities.png");
|
||||
REQUIRE(worked);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue