use godot::prelude::*; use godot::global::Key; use godot::classes::{AudioStreamOggVorbis, Engine, InputEvent, InputEventKey}; #[derive(GodotClass)] #[class(base=Node)] struct Manager { #[export(file = "*.ogg")] bgm: GString, #[var] beat_count: i32, #[var] scenes: Array>, current_scene: Option, instanced_scenes: Vec>, base: Base } #[godot_api] impl INode for Manager { fn init(base: Base) -> Self { Self { bgm: GString::from(""), beat_count: 0, scenes: Array::new(), current_scene: None, instanced_scenes: Vec::new(), base, } } fn unhandled_input(&mut self, event: Gd) { if event.is_released() { if let Ok(key) = event.clone().try_cast::() { if key.get_keycode() == Key::ESCAPE { godot_print!("Goodbye!"); self.base_mut().get_tree().unwrap().quit(); } } } } } #[godot_api] impl Manager { #[func] fn set_scene(&mut self, number: i32) { let current_scene = self.current_scene; let scene = self.instanced_scenes[number as usize].clone(); // Memory leak??? Idk self.current_scene = Some(self.instanced_scenes[number as usize].get_index()); let node: Option>; match current_scene { Some(_) => { node = self.base_mut().get_child(current_scene.unwrap()); match node { Some(value) => { value.upcast::().queue_free(); } None => {} }; } None => {} } self.base_mut().add_child(scene); } #[func] fn register_scene(&mut self, scene: Gd) { self.instanced_scenes.push(scene.instantiate_as()) } #[func] fn start_audio(&mut self) { let editor_hint = Engine::singleton().is_editor_hint(); if !editor_hint { let bgm = self.bgm.clone(); let mut stream: Gd = load(bgm); stream.set_loop(false); let mut player = AudioStreamPlayer::new_alloc(); player.set_stream(stream); player.set_autoplay(true); self.base_mut().add_child(player); } } }