Make it so the canvas for the map view is calculated based on the font size, which will allow for zooming.

main
Zed A. Shaw 10 months ago
parent 9f1e9717a0
commit 02a45d890f
  1. 24
      gui.cpp
  2. 9
      gui.hpp
  3. 18
      systems.cpp

@ -50,18 +50,30 @@ sf::Color GUI::color(Value val) {
return VALUES[size_t(val)];
}
GUI::GUI() : $game_map(GAME_MAP_X, GAME_MAP_Y),
$canvas(VIEW_PORT_X * 2, VIEW_PORT_Y * 4),
GUI::GUI() :
$game_map(GAME_MAP_X, GAME_MAP_Y),
$window(sf::VideoMode(VIDEO_X,VIDEO_Y), "Roguish"),
$screen(SCREEN_X, SCREEN_Y),
$map_screen(VIEW_PORT_X, VIEW_PORT_Y)
$map_screen(0,0)
{
$font.loadFromFile("./assets/text.otf");
// calculate display size
sf::Glyph base_glyph = $font.getGlyph(L'', MAP_FONT_SIZE, false);
auto bounds = base_glyph.bounds;
$view_port = {
size_t(std::ceil((VIDEO_X - GAME_MAP_POS) / bounds.width)),
size_t(std::ceil(VIDEO_Y / bounds.height))
};
// set canvas to best size
$canvas = Canvas($view_port.x * 2, $view_port.y * 4);
$map_screen = Screen($view_port.x, $view_port.y);
int res = $hit_buf.loadFromFile("./assets/hit.wav");
dbc::check(res, "failed to load hit.wav");
$hit_sound.setBuffer($hit_buf);
$font.loadFromFile("./assets/text.otf");
$ui_text.setFont($font);
$ui_text.setPosition(0,0);
$ui_text.setCharacterSize(UI_FONT_SIZE);
@ -74,7 +86,7 @@ void GUI::create_renderer() {
auto player = $world.get<Player>();
$map_view = Renderer([&] {
System::draw_map($world, $game_map, $canvas, VIEW_PORT_X, VIEW_PORT_Y);
System::draw_map($world, $game_map, $canvas, $view_port.x, $view_port.y);
return canvas($canvas);
});

@ -17,16 +17,14 @@
using std::string;
using ftxui::Canvas, ftxui::Component, ftxui::Screen;
constexpr int GAME_MAP_X = 60;
constexpr int GAME_MAP_Y = 30;
constexpr int VIEW_PORT_X = 30;
constexpr int VIEW_PORT_Y = 15;
constexpr int GAME_MAP_X = 90;
constexpr int GAME_MAP_Y = 90;
constexpr int GAME_MAP_POS = 600;
constexpr int SCREEN_X = 40;
constexpr int SCREEN_Y = 30;
constexpr int VIDEO_X = 1600;
constexpr int VIDEO_Y = 900;
constexpr int MAP_FONT_SIZE=60;
constexpr int MAP_FONT_SIZE=90;
constexpr int UI_FONT_SIZE=30;
enum class Value {
@ -52,6 +50,7 @@ class GUI {
DinkyECS::World $world;
sf::Texture $font_texture;
std::unordered_map<wchar_t, sf::Sprite> $sprites;
Point $view_port = {0,0};
public:
GUI();

@ -25,14 +25,18 @@ void System::enemy_pathing(DinkyECS::World &world, Map &game_map, Player &player
void System::motion(DinkyECS::World &world, Map &game_map) {
world.system<Position, Motion>([&](const auto &ent, auto &position, auto &motion) {
Point move_to = {
position.location.x + motion.dx,
position.location.y + motion.dy
};
motion = {0,0}; // clear it after getting it
// don't process entities that don't move
if(motion.dx != 0 || motion.dy != 0) {
Point move_to = {
position.location.x + motion.dx,
position.location.y + motion.dy
};
motion = {0,0}; // clear it after getting it
if(game_map.inmap(move_to.x, move_to.y) && !game_map.iswall(move_to.x,move_to.y)) {
position.location = move_to;
// avoid colision, but could this be a different system?
if(game_map.inmap(move_to.x, move_to.y) && !game_map.iswall(move_to.x,move_to.y)) {
position.location = move_to;
}
}
});
}

Loading…
Cancel
Save