engine/examples/simple_window/src/main.rs

84 lines
2.2 KiB
Rust
Raw Normal View History

2025-02-26 11:22:32 +00:00
use anyhow::Result;
2025-02-26 11:22:32 +00:00
use ecs::*;
2025-03-10 12:40:33 +00:00
use engine::prelude::*;
2025-02-26 11:22:32 +00:00
fn main() -> Result<()> {
let mut world_builder = World::builder();
2025-02-28 14:13:19 +00:00
Engine::new::<GameState>(EngineCreateInfo::default(), &mut world_builder)?;
world_builder.add_system(GameState::update);
2025-03-08 15:01:20 +00:00
world_builder.resources.insert(GameState::default());
2025-02-26 11:22:32 +00:00
2025-03-03 14:00:58 +00:00
let view = world_builder.resources.get_mut::<Scene>().view_mut();
2025-03-10 12:40:33 +00:00
let camera_control = FreeCameraControl::new(view)?;
world_builder.resources.insert(camera_control);
2025-03-03 14:00:58 +00:00
2025-02-26 11:22:32 +00:00
world_builder.build().run()
}
2025-02-28 14:13:19 +00:00
2025-03-08 15:01:20 +00:00
#[derive(Default)]
2025-02-28 14:13:19 +00:00
enum GameState {
2025-03-08 15:01:20 +00:00
#[default]
2025-02-28 14:13:19 +00:00
Startup,
2025-03-09 07:32:34 +00:00
2025-02-28 14:13:19 +00:00
Game(Game),
}
impl GameState {
fn update(world: &mut World) -> Result<bool> {
2025-03-08 15:01:20 +00:00
let me = world.resources.get_mut_unchecked::<Self>();
match me {
2025-03-10 12:40:33 +00:00
GameState::Startup => *me = GameState::Game(Game),
2025-02-28 14:13:19 +00:00
GameState::Game(game) => game.update(world)?,
}
Ok(true)
}
}
impl EventConsumer for GameState {
2025-03-03 08:47:37 +00:00
fn event(&mut self, world: &mut World, event: EngineEvent<'_>) -> Result<()> {
2025-02-28 14:13:19 +00:00
match self {
GameState::Startup => (),
GameState::Game(game) => game.event(world, event)?,
}
Ok(())
}
}
2025-03-10 12:40:33 +00:00
struct Game;
2025-02-28 14:13:19 +00:00
impl Game {
2025-03-10 12:40:33 +00:00
fn update(&mut self, _world: &mut World) -> Result<()> {
2025-02-28 14:13:19 +00:00
Ok(())
}
2025-03-10 12:40:33 +00:00
fn event(&mut self, world: &mut World, event: EngineEvent<'_>) -> Result<()> {
match event {
EngineEvent::MouseButtonDown(MouseButton::Left) => {
let camera_control = world.resources.get_mut::<FreeCameraControl>();
camera_control.mouse_down();
}
EngineEvent::MouseButtonUp(MouseButton::Left) => {
let camera_control = world.resources.get_mut::<FreeCameraControl>();
camera_control.mouse_release();
}
EngineEvent::MouseMotion(x, y) => {
let mut resources = world.resources.multi_mut();
let scene = resources.get::<Scene>();
let camera_control = resources.get::<FreeCameraControl>();
camera_control.mouse_move(x, y, scene.view_mut())?;
}
_ => (),
}
2025-02-28 14:13:19 +00:00
Ok(())
}
}