MiniDemoTools/src/classes/manager.rs
2024-08-11 23:23:54 +03:00

86 lines
No EOL
2.4 KiB
Rust

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<Gd<PackedScene>>,
current_scene: Option<i32>,
instanced_scenes: Vec<Gd<Node>>,
base: Base<Node>
}
#[godot_api]
impl INode for Manager {
fn init(base: Base<Node>) -> 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<InputEvent>) {
if event.is_released() {
if let Ok(key) = event.clone().try_cast::<InputEventKey>() {
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<Gd<Node>>;
match current_scene {
Some(_) => {
node = self.base_mut().get_child(current_scene.unwrap());
match node {
Some(value) => {
value.upcast::<Node>().queue_free();
}
None => {}
};
}
None => {}
}
self.base_mut().add_child(scene);
}
#[func]
fn register_scene(&mut self, scene: Gd<PackedScene>) {
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<AudioStreamOggVorbis> = 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);
}
}
}