2025-02-26 11:22:32 +00:00
|
|
|
use anyhow::Result;
|
2025-02-26 13:51:44 +00:00
|
|
|
|
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
|
|
|
|
2025-04-10 18:09:20 +00:00
|
|
|
struct CameraControlStart;
|
|
|
|
struct CameraControlEnd;
|
|
|
|
struct CameraControlMove {
|
|
|
|
x: u32,
|
|
|
|
y: u32,
|
|
|
|
}
|
|
|
|
|
2025-02-26 11:22:32 +00:00
|
|
|
fn main() -> Result<()> {
|
|
|
|
let mut world_builder = World::builder();
|
2025-02-26 13:51:44 +00:00
|
|
|
|
2025-02-28 14:13:19 +00:00
|
|
|
Engine::new::<GameState>(EngineCreateInfo::default(), &mut world_builder)?;
|
|
|
|
|
2025-04-07 14:56:35 +00:00
|
|
|
world_builder.add_system(10, 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-04-10 18:09:20 +00:00
|
|
|
world_builder.events.register_event::<CameraControlStart>();
|
|
|
|
world_builder.events.register_event::<CameraControlEnd>();
|
|
|
|
world_builder.events.register_event::<CameraControlMove>();
|
|
|
|
|
|
|
|
world_builder.events.add_reader(Game::enable_camera_control);
|
|
|
|
world_builder
|
|
|
|
.events
|
|
|
|
.add_reader(Game::disable_camera_control);
|
|
|
|
world_builder.events.add_reader(Game::update_mouse);
|
|
|
|
|
2025-04-05 08:27:57 +00:00
|
|
|
let scene: &mut Scene = world_builder.resources.get_mut()?;
|
|
|
|
let view = 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-04-05 08:27:57 +00:00
|
|
|
#[derive(Default, Resource)]
|
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 {
|
2025-04-10 18:09:20 +00:00
|
|
|
fn update(commands: &mut Commands, game_state: &mut GameState) -> Result<bool> {
|
|
|
|
match game_state {
|
|
|
|
GameState::Startup => *game_state = GameState::Game(Game),
|
|
|
|
GameState::Game(game) => game.update(commands)?,
|
2025-02-28 14:13:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Ok(true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl EventConsumer for GameState {
|
2025-04-10 18:09:20 +00:00
|
|
|
fn event(&mut self, commands: &mut Commands, event: EngineEvent<'_>) -> Result<()> {
|
2025-02-28 14:13:19 +00:00
|
|
|
match self {
|
|
|
|
GameState::Startup => (),
|
2025-04-10 18:09:20 +00:00
|
|
|
GameState::Game(game) => game.event(commands, event)?,
|
2025-02-28 14:13:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-03-10 12:40:33 +00:00
|
|
|
struct Game;
|
2025-02-28 14:13:19 +00:00
|
|
|
|
|
|
|
impl Game {
|
2025-04-10 18:09:20 +00:00
|
|
|
fn enable_camera_control(
|
|
|
|
_: &CameraControlStart,
|
|
|
|
_commands: &mut Commands,
|
|
|
|
camera_control: &mut FreeCameraControl,
|
|
|
|
) -> Result<()> {
|
|
|
|
camera_control.mouse_down();
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn disable_camera_control(
|
|
|
|
_: &CameraControlEnd,
|
|
|
|
_commands: &mut Commands,
|
|
|
|
camera_control: &mut FreeCameraControl,
|
|
|
|
) -> Result<()> {
|
|
|
|
camera_control.mouse_release();
|
|
|
|
|
2025-02-28 14:13:19 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2025-04-10 18:09:20 +00:00
|
|
|
fn update_mouse(
|
|
|
|
camera_move: &CameraControlMove,
|
|
|
|
_commands: &mut Commands,
|
|
|
|
camera_control: &mut FreeCameraControl,
|
|
|
|
scene: &mut Scene,
|
|
|
|
) -> Result<()> {
|
|
|
|
camera_control.mouse_move(camera_move.x, camera_move.y, scene.view_mut())?;
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn update(&mut self, _commands: &mut Commands) -> Result<()> {
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn event(&mut self, commands: &mut Commands, event: EngineEvent<'_>) -> Result<()> {
|
2025-03-10 12:40:33 +00:00
|
|
|
match event {
|
|
|
|
EngineEvent::MouseButtonDown(MouseButton::Left) => {
|
2025-04-10 18:09:20 +00:00
|
|
|
commands.write_event(CameraControlStart)
|
2025-03-10 12:40:33 +00:00
|
|
|
}
|
2025-04-10 18:09:20 +00:00
|
|
|
EngineEvent::MouseButtonUp(MouseButton::Left) => commands.write_event(CameraControlEnd),
|
|
|
|
EngineEvent::MouseMotion(x, y) => commands.write_event(CameraControlMove { x, y }),
|
2025-03-10 12:40:33 +00:00
|
|
|
|
|
|
|
_ => (),
|
|
|
|
}
|
|
|
|
|
2025-02-28 14:13:19 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|