use anyhow::Result; use ecs::*; use engine::prelude::*; fn main() -> Result<()> { let mut world_builder = World::builder(); Engine::new::(EngineCreateInfo::default(), &mut world_builder)?; world_builder.add_system(10, GameState::update); world_builder.resources.insert(GameState::default()); let scene: &mut Scene = world_builder.resources.get_mut()?; let view = scene.view_mut(); let camera_control = FreeCameraControl::new(view)?; world_builder.resources.insert(camera_control); world_builder.build().run() } #[derive(Default, Resource)] enum GameState { #[default] Startup, Game(Game), } impl GameState { fn update(world: &mut World) -> Result { let me = world.resources.get_mut_unchecked::(); match me { GameState::Startup => *me = GameState::Game(Game), GameState::Game(game) => game.update(world)?, } Ok(true) } } impl EventConsumer for GameState { fn event(&mut self, world: &mut World, event: EngineEvent<'_>) -> Result<()> { match self { GameState::Startup => (), GameState::Game(game) => game.event(world, event)?, } Ok(()) } } struct Game; impl Game { fn update(&mut self, _world: &mut World) -> Result<()> { Ok(()) } fn event(&mut self, world: &mut World, event: EngineEvent<'_>) -> Result<()> { match event { EngineEvent::MouseButtonDown(MouseButton::Left) => { let camera_control: &mut FreeCameraControl = world.resources.get_mut()?; camera_control.mouse_down(); } EngineEvent::MouseButtonUp(MouseButton::Left) => { let camera_control: &mut FreeCameraControl = world.resources.get_mut()?; camera_control.mouse_release(); } EngineEvent::MouseMotion(x, y) => { let (scene, camera_control): (&mut Scene, &mut FreeCameraControl) = world.resources.get_mut()?; camera_control.mouse_move(x, y, scene.view_mut())?; } _ => (), } Ok(()) } }