#include "storyboard/ui.hpp" #include "components.hpp" #include "animation.hpp" #include "sound.hpp" #include "config.hpp" #include #include #include #include namespace storyboard { UI::UI(const std::string& story_name) : $view_texture({SCREEN_WIDTH, SCREEN_HEIGHT}), $view_sprite($view_texture.getTexture()) { $view_sprite.setPosition({0, 0}); auto config = settings::get("stories"); $story = components::convert(config[story_name]); $audio = sound::get_sound_pair($story.audio).sound; } void UI::init() { $ui.position(0,0, SCREEN_WIDTH, SCREEN_HEIGHT); $ui.set($ui.MAIN, {$ui.$parser, guecs::THEME.TRANSPARENT}); auto& background = $ui.get($ui.MAIN); background.set_sprite($story.image, true); for(auto& line : $story.layout) { $layout.append(line); } $ui.layout($layout); $audio->play(); } void UI::render(sf::RenderWindow &window) { track_audio(); $view_texture.clear(); $camera.render($view_texture); $ui.render($view_texture); // $ui.debug_layout($view_texture); $view_texture.display(); window.draw($view_sprite); } bool UI::playing() { return $audio->getStatus() == sf::SoundSource::Status::Playing; } sf::Time parse_time_code(const std::string& time) { std::chrono::seconds out{}; std::istringstream is{time}; is >> std::chrono::parse("%M:%S", out); dbc::check(!is.fail(), fmt::format("Time parse failed: {}", time)); return sf::Time(out); } void UI::track_audio() { auto& beat = $story.beats[cur_beat % $story.beats.size()]; auto track_head = $audio->getPlayingOffset(); auto next_beat = parse_time_code(beat[0]); if(track_head >= next_beat) { if($moving) return; $moving = true; // prevent motion until next tick // get the original zoom target as from auto& cell = $ui.cell_for($zoom_target); $camera.position(cell.mid_x, cell.mid_y); $zoom_target = beat[1]; $camera.style(beat[2]); // get the new target from the cell names zoom($zoom_target); $camera.play(); cur_beat++; } else { $moving = false; } } bool UI::mouse(float, float, guecs::Modifiers) { $audio->stop(); return true; } void UI::zoom(const std::string &cell_name) { auto& cell = $ui.cell_for(cell_name); $camera.resize(float(cell.w), float(cell.h)); $camera.move(float(cell.mid_x), float(cell.mid_y)); } void UI::reset() { sf::FloatRect where{{0,0},{SCREEN_WIDTH, SCREEN_HEIGHT}}; sf::View view{where}; $view_texture.setView(view); } }