69 lines
1.9 KiB
Rust
69 lines
1.9 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>>,
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|