Fly controller (#26)

This commit is contained in:
extrawurst
2025-04-12 17:16:41 +02:00
committed by GitHub
parent dab4ea0656
commit 9b3765c41d
10 changed files with 550 additions and 325 deletions

View File

@@ -2,10 +2,8 @@ use avian3d::prelude::*;
use bevy::prelude::*;
use crate::{
GameState,
control::{Controls, controller::PlayerMovement},
loading_assets::UIAssets,
physics_layers::GameLayer,
GameState, control::Controls, control::controller_common::PlayerMovement,
loading_assets::UIAssets, physics_layers::GameLayer,
};
#[derive(Component, Reflect, Debug)]
@@ -14,9 +12,10 @@ pub struct CameraTarget;
#[derive(Component, Reflect, Debug)]
pub struct CameraArmRotation;
#[derive(Component, Reflect, Debug)]
/// Requested camera rotation based on various input sources (keyboard, gamepad)
#[derive(Component, Reflect, Debug, Default, Deref, DerefMut)]
#[reflect(Component)]
pub struct CameraRotation(pub f32);
pub struct CameraRotationInput(pub Vec2);
#[derive(Resource, Reflect, Debug, Default)]
#[reflect(Resource)]
@@ -43,7 +42,7 @@ impl MainCamera {
}
pub fn plugin(app: &mut App) {
app.register_type::<CameraRotation>();
app.register_type::<CameraRotationInput>();
app.register_type::<CameraState>();
app.register_type::<MainCamera>();
@@ -66,7 +65,7 @@ fn startup(mut commands: Commands) {
commands.spawn((
Camera3d::default(),
MainCamera::new(Vec3::new(0., 2.5, -13.)),
CameraRotation(0.),
CameraRotationInput::default(),
));
}
@@ -118,7 +117,7 @@ fn update_ui(
fn update(
mut cam: Query<
(&MainCamera, &mut Transform, &CameraRotation),
(&MainCamera, &mut Transform, &CameraRotationInput),
(Without<CameraTarget>, Without<CameraArmRotation>),
>,
target: Query<&GlobalTransform, (With<CameraTarget>, Without<CameraArmRotation>)>,
@@ -134,15 +133,15 @@ fn update(
return;
};
let Ok(rotation) = arm_rotation.get_single() else {
let Ok(arm_tf) = arm_rotation.get_single() else {
return;
};
let Ok((camera, mut cam_transform, cam_rotation)) = cam.get_single_mut() else {
let Ok((camera, mut cam_transform, cam_rotation_input)) = cam.get_single_mut() else {
return;
};
let direction = rotation.rotation * Quat::from_rotation_y(cam_rotation.0) * camera.dir;
let direction = arm_tf.rotation * Quat::from_rotation_y(cam_rotation_input.x) * camera.dir;
let max_distance = camera.distance;
@@ -162,7 +161,7 @@ fn update(
fn rotate_view_keyboard(
mut controls: ResMut<Controls>,
mut cam: Query<&mut CameraRotation>,
mut cam: Query<&mut CameraRotationInput>,
movement: Res<PlayerMovement>,
) {
let Ok(mut cam) = cam.get_single_mut() else {
@@ -171,20 +170,21 @@ fn rotate_view_keyboard(
if !controls.keyboard_state.view_mode {
if movement.any_direction {
cam.0 = 0.;
cam.x = 0.;
}
return;
}
cam.0 += controls.keyboard_state.look_dir.x * -0.001;
cam.x += controls.keyboard_state.look_dir.x * -0.001;
cam.y += controls.keyboard_state.look_dir.y * -0.001;
controls.keyboard_state.look_dir = Vec2::ZERO;
}
fn rotate_view_gamepad(
controls: Res<Controls>,
mut cam: Query<&mut CameraRotation>,
mut cam: Query<&mut CameraRotationInput>,
movement: Res<PlayerMovement>,
) {
let Ok(mut cam) = cam.get_single_mut() else {
@@ -197,9 +197,10 @@ fn rotate_view_gamepad(
if !gamepad.view_mode {
if movement.any_direction {
cam.0 = 0.;
cam.x = 0.;
}
} else {
cam.0 += gamepad.look_dir.x * -0.001;
cam.x += gamepad.look_dir.x * -0.001;
cam.y += gamepad.look_dir.y * -0.001;
}
}