pub mod util; use bevy::app::{App, Update}; use bevy::window::PrimaryWindow; use leafwing_input_manager::Actionlike; use leafwing_input_manager::input_map::InputMap; use leafwing_input_manager::prelude::{ActionState, ButtonlikeChord}; use crate::ecs::{MainCamera, Me}; use crate::prelude::*; #[derive(Actionlike, PartialEq, Eq, Hash, Clone, Copy, Debug, Reflect)] pub enum ClientAction { ThrustForward, ThrustBackward, ThrustRight, ThrustLeft, TorqueCw, TorqueCcw } pub fn input_plugin(app: &mut App) { app .insert_resource(CursorWorldCoordinates(None)) .insert_resource(InputMap::new([ (ClientAction::ThrustForward, KeyCode::KeyW), (ClientAction::ThrustForward, KeyCode::ArrowUp), (ClientAction::ThrustBackward, KeyCode::KeyS), (ClientAction::ThrustBackward, KeyCode::ArrowDown), (ClientAction::ThrustLeft, KeyCode::KeyQ), // TODO: Shift+left (ClientAction::ThrustRight, KeyCode::KeyE), // TODO: Shift+right (ClientAction::TorqueCw, KeyCode::KeyD), (ClientAction::TorqueCw, KeyCode::ArrowRight), (ClientAction::TorqueCcw, KeyCode::KeyA), (ClientAction::TorqueCcw, KeyCode::ArrowLeft), ])) .init_resource::>() .add_systems(Update, update_cursor_position); } #[derive(Resource, Default)] pub struct CursorWorldCoordinates(pub Option); fn update_cursor_position( q_windows: Query<&Window, With>, q_camera: Query<(&Camera, &GlobalTransform), With>, mut coords: ResMut, ) { let (camera, camera_transform) = q_camera.single().unwrap(); let window = q_windows.single().unwrap(); if let Some(world_position) = window .cursor_position() .and_then(|cursor| camera.viewport_to_world(camera_transform, cursor).ok()) .map(|ray| ray.origin.truncate()) { coords.0 = Some(world_position); } else { coords.0 = None; } }