MiniDemoTools/src/manager.rs

69 lines
1.9 KiB
Rust
Raw Normal View History

2024-08-10 12:00:47 +03:00
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>>,
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(),
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 scene = self.instanced_scenes[number as usize].clone(); // Memory leak??? Idk
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();
godot_print!(" Hello world fj");
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);
}
}
}