From 036fc195670ca136b32ffe03f0622d7fe6075217 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Fri, 27 Jun 2025 19:34:55 -0400 Subject: [PATCH] First person camera Input States --- src/components/camera.rs | 11 ++ src/main.rs | 1 + src/plugins/camera.rs | 61 +++++++++++ src/plugins/free_cam.rs | 71 ------------ src/plugins/game.rs | 184 +++++++++++++------------------- src/plugins/mod.rs | 5 +- src/plugins/player.rs | 14 ++- src/plugins/state_management.rs | 16 +++ src/plugins/types.rs | 5 +- src/states/input.rs | 20 ++++ src/states/mod.rs | 1 + 11 files changed, 200 insertions(+), 189 deletions(-) create mode 100644 src/plugins/camera.rs delete mode 100644 src/plugins/free_cam.rs create mode 100644 src/plugins/state_management.rs create mode 100644 src/states/input.rs create mode 100644 src/states/mod.rs diff --git a/src/components/camera.rs b/src/components/camera.rs index e07c408..4b14887 100644 --- a/src/components/camera.rs +++ b/src/components/camera.rs @@ -37,3 +37,14 @@ impl Default for FollowTarget { }; } } + +#[derive(Component, Default, Reflect)] +pub enum CameraMode { + #[default] + Player, + Ship, + Disabled, +} + +#[derive(Component, Reflect)] +pub struct CameraAttachment(pub Entity); diff --git a/src/main.rs b/src/main.rs index aac9eae..01a0958 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ mod plugins; +mod states; mod utils; use bevy::{prelude::*, window::PresentMode}; use bevy_inspector_egui::{bevy_egui::EguiPlugin, quick::WorldInspectorPlugin}; diff --git a/src/plugins/camera.rs b/src/plugins/camera.rs new file mode 100644 index 0000000..056d7d4 --- /dev/null +++ b/src/plugins/camera.rs @@ -0,0 +1,61 @@ +use bevy::prelude::*; +#[cfg(feature = "dev")] +use bevy::window::PrimaryWindow; + +use crate::components::camera::*; + +pub struct CameraPlugin; + +impl Plugin for CameraPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Update, camera_pitch); + app.add_systems(Update, camera_attachment); + #[cfg(feature = "dev")] + app.add_systems(Update, camera_toggle); + } +} + +pub fn camera_attachment( + attachment_targets: Query<&GlobalTransform>, + cam: Single<(&mut Transform, &CameraAttachment, &CameraMode)>, +) { + let (mut transform, attach, mode) = cam.into_inner(); + + if let Ok(tgt) = attachment_targets.get(attach.0) { + match mode { + CameraMode::Player => { + transform.rotation = tgt.rotation(); + transform.translation = tgt.translation(); + } + CameraMode::Ship => todo!("Ship Mode"), + CameraMode::Disabled => (), + } + } +} + +pub fn camera_pitch(cam_query: Query<(&mut Transform, &CameraPitch)>) { + for (mut cam_transform, pitch) in cam_query { + cam_transform.rotation = Quat::from_rotation_x(pitch.0); + } +} + +#[cfg(feature = "dev")] +pub fn camera_toggle( + key: Res>, + mut window: Single<&mut Window, With>, + camera: Single<&mut CameraMode>, +) { + use bevy::window::CursorGrabMode; + let mut mode = camera.into_inner(); + if key.just_pressed(KeyCode::Escape) { + if window.cursor_options.visible { + *mode = CameraMode::Player; + window.cursor_options.grab_mode = CursorGrabMode::Locked; + window.cursor_options.visible = false; + } else { + *mode = CameraMode::Disabled; + window.cursor_options.grab_mode = CursorGrabMode::None; + window.cursor_options.visible = true; + } + } +} diff --git a/src/plugins/free_cam.rs b/src/plugins/free_cam.rs deleted file mode 100644 index b3426f7..0000000 --- a/src/plugins/free_cam.rs +++ /dev/null @@ -1,71 +0,0 @@ -use std::f32::consts::FRAC_PI_2; - -use bevy::{input::mouse::MouseMotion, prelude::*}; - -use crate::{components::camera::*, utils::input::get_mouse_delta}; - -pub struct FreeCamPlugin; - -impl Plugin for FreeCamPlugin { - fn build(&self, app: &mut App) { - app.add_systems(Update, ((camera_yaw, camera_pitch).chain(), free_camera)); - } -} - -const FLY_SPEED: f32 = 10.0; -pub fn free_camera( - cam_query: Single<(&mut Transform, &FreeCam), (With, Without)>, - cam_pitch: Single<&CameraPitch>, - key: Res>, - time: Res