use std::cell; use std::rc; use crate::colors; use crate::components; use crate::gamestate; use crate::resources; use crate::states; use crate::svg_loader; pub struct LevelLoadingState { node_world: legion::World, resources: legion::Resources, node_schedule: legion::Schedule, svg_level: rc::Rc>>, } impl LevelLoadingState { pub fn new() -> LevelLoadingState { let mut resources = legion::Resources::default(); resources.insert(resources::Clock::new()); resources.insert(resources::Rendering::new("game-canvas").unwrap()); let mut node_world = legion::World::default(); node_world.push(( components::TheSun, components::Position::new(1920.0 / 2.0, 1080.0 / 2.0), )); let node_schedule = legion::Schedule::builder() .add_thread_local(components::draw_thesun_system()) .build(); let svg_level = rc::Rc::new(cell::RefCell::new(None)); let svg_level_cell = svg_level.clone(); wasm_bindgen_futures::spawn_local(async move { let level = svg_loader::SvgLevel::load_from_svg_file("resources/testlevel.svg") .await .unwrap(); *svg_level_cell.borrow_mut() = Some(level); }); LevelLoadingState { node_world, resources, node_schedule, svg_level, } } } impl gamestate::State for LevelLoadingState { fn init(&mut self, _init: gamestate::StateInitializer) -> gamestate::Transition { gamestate::Transition::Loop } fn update(&mut self) -> gamestate::Transition { { let rendering = self.resources.get_mut::().unwrap(); rendering.set_fill_style(&colors::BACKGROUND); rendering.fill_rect(0.0, 0.0, 1920.0, 1080.0); } self.node_schedule .execute(&mut self.node_world, &mut self.resources); // TODO: Polling the future/promise here is really ugly ... if let Some(level) = self.svg_level.borrow_mut().take() { crate::console_log!("Level was loaded!"); gamestate::Transition::replace(states::InGameState::new(level)) } else { gamestate::Transition::Loop } } }