A bit of optimization to keep from generating the sorted sprite list over and over. Also tried to solve the problem of tombstone covering everything but no luck.

This commit is contained in:
Zed A. Shaw 2025-08-03 23:58:59 -04:00
parent 077f0e84ea
commit 9bf6926dc3
9 changed files with 36 additions and 32 deletions

View file

@ -9,7 +9,7 @@ namespace gui {
MainUI::MainUI(sf::RenderWindow& window) :
$window(window),
$rayview(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT)
$rayview(std::make_shared<Raycaster>(RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT))
{
$window.setVerticalSyncEnabled(VSYNC);
$window.setFramerateLimit(FRAME_LIMIT);
@ -23,25 +23,25 @@ namespace gui {
auto& player_position = $level.world->get<Position>($level.player);
auto player = player_position.location;
$rayview.init_shaders();
$rayview.set_position(RAY_VIEW_X, RAY_VIEW_Y);
$rayview.position_camera(player.x + 0.5, player.y + 0.5);
$rayview->init_shaders();
$rayview->set_position(RAY_VIEW_X, RAY_VIEW_Y);
$rayview->position_camera(player.x + 0.5, player.y + 0.5);
$overlay_ui.init();
}
DinkyECS::Entity MainUI::camera_aim() {
// what happens if there's two things at that spot
if($level.collision->something_there($rayview.aiming_at)) {
return $level.collision->get($rayview.aiming_at);
if($level.collision->something_there($rayview->aiming_at)) {
return $level.collision->get($rayview->aiming_at);
} else {
return 0;
}
}
void MainUI::render() {
if($needs_render) $rayview.render();
$rayview.draw($window);
if($needs_render) $rayview->render();
$rayview->draw($window);
$overlay_ui.render($window);
}
@ -51,9 +51,9 @@ namespace gui {
}
std::optional<Point> MainUI::play_rotate() {
if($rayview.play_rotate()) {
if($rayview->play_rotate()) {
$needs_render = false;
return std::make_optional<Point>($rayview.aiming_at);
return std::make_optional<Point>($rayview->aiming_at);
} else {
$needs_render = true;
return std::nullopt;
@ -61,11 +61,11 @@ namespace gui {
}
std::optional<components::Position> MainUI::play_move() {
if($rayview.play_move()) {
if($rayview->play_move()) {
$needs_render = false;
return std::make_optional<Position>(
$rayview.camera_target(),
$rayview.aiming_at);
$rayview->camera_target(),
$rayview->aiming_at);
} else {
$needs_render = true;
return std::nullopt;
@ -76,15 +76,15 @@ namespace gui {
// -1 is left, 1 is right
int extra = (amount == 0.5) * dir;
$compass_dir = ($compass_dir + dir + extra) % COMPASS.size();
$rayview.plan_rotate(dir, amount);
$rayview->plan_rotate(dir, amount);
}
Point MainUI::plan_move(int dir, bool strafe) {
return $rayview.plan_move(dir, strafe);
return $rayview->plan_move(dir, strafe);
}
void MainUI::abort_plan() {
$rayview.abort_plan();
$rayview->abort_plan();
}
void MainUI::dead_entity(DinkyECS::Entity entity) {
@ -92,7 +92,7 @@ namespace gui {
// (see System::distribute_loot) then this can be fixed or improved
if($level.world->has<components::Sprite>(entity)) {
auto &sprite = $level.world->get<components::Sprite>(entity);
$rayview.update_sprite(entity, sprite);
$rayview->update_sprite(entity, sprite);
}
}
@ -101,10 +101,10 @@ namespace gui {
auto& player_position = $level.world->get<Position>($level.player);
auto player = player_position.location;
$rayview.update_level($level);
$rayview.position_camera(player.x + 0.5, player.y + 0.5);
$rayview->update_level($level);
$rayview->position_camera(player.x + 0.5, player.y + 0.5);
player_position.aiming_at = $rayview.aiming_at;
player_position.aiming_at = $rayview->aiming_at;
$compass_dir = 0;