Refactor to allow for the new screen flow.

This commit is contained in:
Zed A. Shaw 2026-05-27 12:09:17 -04:00
parent e7b6b42698
commit 6f9e8a3ed4
10 changed files with 59 additions and 52 deletions

View file

@ -79,8 +79,8 @@ constexpr int SCENE_VIEW_Y=0;
constexpr int INITIAL_MAP_W = 21;
constexpr int INITIAL_MAP_H = 21;
constexpr float DEFAULT_ROTATE=0.25f;
constexpr float DEFAULT_ROTATE_SPEED=DEFAULT_ROTATE / 2.0f;
constexpr float DEFAULT_ROTATE=0.5f;
constexpr float DEFAULT_ROTATE_SPEED=DEFAULT_ROTATE / 5.0f;
constexpr float DEFAULT_MOVE_SPEED=0.1f;
// for the panels/renderer

View file

@ -121,11 +121,10 @@ inline void set_scale_position(sf::Sprite& sprite, sf::Vector2f& position, sf::V
}
void Raycaster::sprite_casting() {
void Raycaster::sprite_casting(sf::RenderTarget& target) {
auto& lights = $level.lights->lighting();
auto world = $level.world;
$level.collision->distance_sorted($sprite_order, {(size_t)$pos_x, (size_t)$pos_y}, RENDER_DISTANCE);
$sprites_to_render.clear();
// BUG: shaders are shared between sprites
// BUG: sprites seem to be shared too? Put a torch on the floor in a room then another to its left and only one is visible at a time.
@ -226,12 +225,13 @@ void Raycaster::sprite_casting() {
auto anim = world->get_if<animation::Animation>(rec.entity);
if(anim != nullptr && anim->playing) {
// BUG: why use refs for sf_sprite? Can it just be pointer?
step_animation(*anim, *sf_sprite, position, scale, in_texture, origin);
} else {
set_scale_position(*sf_sprite, position, scale, in_texture, origin);
}
$sprites_to_render.emplace_back(sf_sprite, effect);
target.draw(*sf_sprite, effect.get());
}
}
}
@ -438,16 +438,13 @@ void Raycaster::update() {
draw_ceiling_floor();
cast_rays();
draw_pixel_buffer();
sprite_casting();
}
// BUG: if target is a rendertarget then I can say it has to be the viewport only, then I can get rid of $screen_pos_x/y
void Raycaster::render(sf::RenderTarget& target) {
target.draw($view_sprite);
for(auto [sprite, effect] : $sprites_to_render) {
target.draw(*sprite, effect.get());
}
sprite_casting(target);
}
void Raycaster::update_sprite(DinkyECS::Entity ent, components::Sprite& sprite) {

View file

@ -21,7 +21,7 @@ struct CameraLOL {
double target_plane_y = 0.0;
};
using SpriteRender = std::pair<std::shared_ptr<sf::Sprite>, std::shared_ptr<sf::Shader>>;
using SpriteRender = std::pair<sf::Sprite, std::shared_ptr<sf::Shader>>;
struct Raycaster {
sf::Texture $view_texture;
@ -52,7 +52,6 @@ struct Raycaster {
std::unordered_map<DinkyECS::Entity, textures::SpriteTexture> $sprites;
// BUG: this can be way better I think
std::vector<SpriteRender> $sprites_to_render;
SortedEntities $sprite_order;
GameDB::Level $level;
@ -64,7 +63,7 @@ struct Raycaster {
void cast_rays();
void draw_ceiling_floor();
void draw_pixel_buffer();
void sprite_casting();
void sprite_casting(sf::RenderTarget& target);
void update();
void render(sf::RenderTarget& target);

View file

@ -18,8 +18,8 @@ namespace gui {
using namespace components;
using game::Event;
FSM::FSM() :
$window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing"),
FSM::FSM(sf::RenderWindow& window) :
$window(window),
$main_ui($window),
$combat_ui(false),
$dnd_loot($status_ui, $loot_ui, $window, $router)

View file

@ -12,7 +12,7 @@
#include "events.hpp"
#include "gui/event_router.hpp"
#include "gui/dnd_loot.hpp"
#include "storyboard/ui.hpp"
#include "storyboard.hpp"
#include "events.hpp"
#include "game/registry.hpp"
@ -31,7 +31,7 @@ namespace gui {
class FSM : public DeadSimpleFSM<State, game::Event> {
public:
sf::RenderWindow $window;
sf::RenderWindow& $window;
bool $draw_stats = false;
bool autowalking = false;
bool $map_open = false;
@ -47,7 +47,7 @@ namespace gui {
DNDLoot $dnd_loot;
System::Registry $systems;
FSM();
FSM(sf::RenderWindow& window);
void event(game::Event ev, std::any data={});
void autowalk();

View file

@ -1,4 +1,4 @@
#include "storyboard/ui.hpp"
#include "gui/storyboard.hpp"
#include "game/components.hpp"
#include "game/sound.hpp"
#include "game/config.hpp"
@ -47,6 +47,10 @@ namespace storyboard {
window.draw($view_sprite);
}
void UI::stop() {
$audio->stop();
}
bool UI::playing() {
return $audio->getStatus() == sf::SoundSource::Status::Playing;
}

View file

@ -29,6 +29,7 @@ namespace storyboard {
void reset();
void track_audio();
bool playing();
void stop();
void config_camera(cinematic::Camera &camera);
};

View file

@ -9,6 +9,34 @@
#include "game/level.hpp"
#include "graphics/camera.hpp"
void play_game(std::shared_ptr<gui::FSM> main) {
sound::play("ambient_1", true);
sound::mute(false);
main->event(game::Event::START);
while(main->active()) {
main->update();
main->render();
if(main->in_state(gui::State::BOSS_FIGHT)) {
main->handle_boss_fight_events();
} else {
// BUG: need to sort out how to deal with this in the FSM
if(main->in_state(gui::State::IDLE)
|| main->in_state(gui::State::LOOTING)
|| main->in_state(gui::State::CUT_SCENE_PLAYING))
{
main->handle_keyboard_mouse();
} else{
main->event(game::Event::TICK);
}
main->handle_world_events();
}
}
}
int main(int argc, char* argv[]) {
try {
gui::Backend backend;
@ -19,41 +47,21 @@ int main(int argc, char* argv[]) {
ai::init("ai");
GameDB::init();
cinematic::init();
sound::mute(true);
gui::FSM main;
main.event(game::Event::START);
Autowalker walker(main);
sf::RenderWindow window(sf::VideoMode({SCREEN_WIDTH, SCREEN_HEIGHT}), "Zed's Raycaster Thing");
window.setVerticalSyncEnabled(VSYNC);
if(FRAME_LIMIT) window.setFramerateLimit(FRAME_LIMIT);
window.setPosition({0,0});
sound::play("ambient_1", true);
auto main = std::make_shared<gui::FSM>(window);
if(argc > 1 && argv[1][0] == 't') {
walker.start_autowalk();
}
while(true) {
play_game(main);
while(main.active()) {
main.update();
main.render();
if(main.in_state(gui::State::BOSS_FIGHT)) {
main.handle_boss_fight_events();
} else {
// BUG: need to sort out how to deal with this in the FSM
if(main.in_state(gui::State::IDLE)
|| main.in_state(gui::State::LOOTING)
|| main.in_state(gui::State::CUT_SCENE_PLAYING))
{
if(main.autowalking) {
walker.autowalk();
} else {
main.handle_keyboard_mouse();
}
} else{
main.event(game::Event::TICK);
}
main.handle_world_events();
if(!main->active()) {
// TODO: this is where we handle the restarts
break;
}
}

View file

@ -28,9 +28,7 @@ sources = files(
'gui/ritual_ui.cpp',
'gui/status_ui.cpp',
'gui/scene_ui.cpp',
# storyboard
'storyboard/ui.cpp',
'gui/storyboard.cpp',
# graphics
'graphics/animation.cpp',

View file

@ -7,7 +7,7 @@
#include "gui/backend.hpp"
#include "gui/event_router.hpp"
#include "graphics/camera.hpp"
#include "storyboard/ui.hpp"
#include "gui/storyboard.hpp"
int main(int, char*[]) {
components::init();