use crate::*;
impl SceneManager {
pub fn create_scene<T>(scene: T) -> SceneRc
where
T: Scene + 'static,
{
Rc::new(RefCell::new(scene))
}
}
impl SceneManager {
pub fn register(&mut self, name: String, scene: SceneRc) {
self.get_mut_scenes().insert(name, scene);
}
pub fn unregister(&mut self, name: &str) {
self.get_mut_scenes().remove(name);
}
pub fn switch_to(&mut self, name: &str) -> bool {
if !self.get_scenes().contains_key(name) {
return false;
}
let current_name: Option<String> = self.get_mut_current_scene_name().clone();
if let Some(name) = current_name.as_ref()
&& let Some(current_scene) = self.get_scenes().get(name)
{
current_scene.borrow_mut().on_exit();
}
self.set_current_scene_name(Some(name.to_string()));
if let Some(new_scene) = self.get_scenes().get(name) {
new_scene.borrow_mut().on_enter();
}
true
}
pub fn request_transition(&mut self, name: String) {
self.set_pending_scene_name(Some(name));
}
pub fn process_pending_transition(&mut self) {
let Some(name) = self.get_mut_pending_scene_name().take() else {
return;
};
self.switch_to(&name);
}
pub fn update(&mut self, delta_time: f64) {
self.process_pending_transition();
let current_name: Option<String> = self.get_mut_current_scene_name().clone();
let Some(current_name) = current_name.as_ref() else {
return;
};
let Some(scene) = self.get_scenes().get(current_name) else {
return;
};
scene.borrow_mut().on_update(delta_time);
}
pub fn render(&self, context: &CanvasRenderingContext2d) {
let Some(current_name) = self.current_scene_name.as_ref() else {
return;
};
let Some(scene) = self.get_scenes().get(current_name) else {
return;
};
scene.borrow().on_render(context);
}
pub fn has_scene(&self, name: &str) -> bool {
self.get_scenes().contains_key(name)
}
pub fn current_name(&self) -> Option<&str> {
self.current_scene_name.as_deref()
}
}
impl Default for SceneManager {
fn default() -> SceneManager {
SceneManager::new()
}
}