use winit::event::WindowEvent;
use super::GameView;
pub trait Scene<S> {
fn on_enter(&mut self, game: &mut GameView<S>);
fn on_exit(&mut self, game: &mut GameView<S>);
fn input(&mut self, event: &WindowEvent, game: &mut GameView<S>) -> bool;
fn update(&mut self, dt: std::time::Duration, game: &mut GameView<S>)
-> Option<SceneReference>;
fn gui_egui(&mut self, ctx: &egui::Context, game: &mut GameView<S>);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SceneReference {
Init,
}
pub struct SceneLibrary;
impl SceneLibrary {
pub fn get_scene<S>(
&self,
game: &mut GameView<S>,
scene: SceneReference,
) -> Box<dyn Scene<S> + Send> {
let _ = game;
match scene {
SceneReference::Init => Box::<MainGameScene>::default(),
}
}
}
#[derive(Default)]
pub struct MainGameScene {
voop: String,
}
impl<S> Scene<S> for MainGameScene {
fn on_enter(&mut self, game: &mut GameView<'_, S>) {
let _ = game;
}
fn on_exit(&mut self, game: &mut GameView<'_, S>) {
let _ = game;
todo!()
}
fn input(&mut self, event: &WindowEvent, game: &mut GameView<'_, S>) -> bool {
let _ = game;
let _ = event;
false
}
fn update(
&mut self,
dt: std::time::Duration,
game: &mut GameView<'_, S>,
) -> Option<SceneReference> {
let dt_secs = dt.as_secs_f32();
let negative = self.voop.starts_with('-');
let negativity = if negative { -1.0 } else { 1.0 };
if self.voop.to_lowercase().ends_with("camera") {
if self.voop.contains("rot") {
game.camera.transform *= glam::Affine3A::from_axis_angle(
glam::Vec3::Z,
negativity * std::f32::consts::FRAC_PI_4 * dt_secs,
);
} else {
game.camera.transform.translation.x += negativity * dt_secs * 0.0025;
}
}
None
}
fn gui_egui(&mut self, ctx: &egui::Context, game: &mut GameView<S>) {
let _ = game;
egui::Window::new("gama")
.default_pos((10.0, 200.0))
.show(ctx, |ui| {
ui.label(">> Welcome to Cat Waiter <<");
if ui
.text_edit_singleline(&mut self.voop)
.on_hover_text("the best textbox of your life")
.changed()
{
log::info!(">> new text: {}", self.voop);
}
});
}
}