fix look around with gamepad

This commit is contained in:
2025-03-20 17:59:54 +01:00
parent 1721a34249
commit cd81f4260d
3 changed files with 46 additions and 9 deletions

View File

@@ -37,7 +37,7 @@ pub fn plugin(app: &mut App) {
app.register_type::<CameraState>(); app.register_type::<CameraState>();
app.init_resource::<CameraState>(); app.init_resource::<CameraState>();
app.add_systems(Startup, startup); app.add_systems(Startup, startup);
app.add_systems(Update, (update, rotate_view)); app.add_systems(Update, (update, rotate_view_keyboard, rotate_view_gamepad));
} }
fn startup(mut commands: Commands) { fn startup(mut commands: Commands) {
@@ -92,7 +92,7 @@ fn update(
*cam_transform = Transform::from_translation(cam_pos).looking_at(target, Vec3::Y); *cam_transform = Transform::from_translation(cam_pos).looking_at(target, Vec3::Y);
} }
fn rotate_view( fn rotate_view_keyboard(
mut controls: ResMut<Controls>, mut controls: ResMut<Controls>,
mut cam: Query<&mut CameraRotation>, mut cam: Query<&mut CameraRotation>,
movement: Res<PlayerMovement>, movement: Res<PlayerMovement>,
@@ -105,6 +105,7 @@ fn rotate_view(
if movement.any_direction { if movement.any_direction {
cam.0 = 0.; cam.0 = 0.;
} }
return; return;
} }
@@ -112,3 +113,25 @@ fn rotate_view(
controls.keyboard_state.look_dir = Vec2::ZERO; controls.keyboard_state.look_dir = Vec2::ZERO;
} }
fn rotate_view_gamepad(
controls: Res<Controls>,
mut cam: Query<&mut CameraRotation>,
movement: Res<PlayerMovement>,
) {
let Ok(mut cam) = cam.get_single_mut() else {
return;
};
let Some(gamepad) = controls.gamepad_state else {
return;
};
if !gamepad.view_mode {
if movement.any_direction {
cam.0 = 0.;
}
} else {
cam.0 += gamepad.look_dir.x * -0.001;
}
}

View File

@@ -56,7 +56,7 @@ fn main() {
app.add_plugins(DefaultPlugins.set(WindowPlugin { app.add_plugins(DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window { primary_window: Some(Window {
title: "HEDZ reloaded".into(), title: "HEDZ reloaded".into(),
resolution: (1024., 768.).into(), // resolution: (1024., 768.).into(),
..default() ..default()
}), }),
..default() ..default()

View File

@@ -56,7 +56,7 @@ pub fn plugin(app: &mut App) {
apply_controls.in_set(TnuaUserControlsSystemSet), apply_controls.in_set(TnuaUserControlsSystemSet),
); );
app.add_systems(Update, rotate_view); app.add_systems(Update, (rotate_view_keyboard, rotate_view_gamepad));
app.add_observer(update_head); app.add_observer(update_head);
} }
@@ -126,7 +126,25 @@ fn spawn(
player_spawned.spawned = true; player_spawned.spawned = true;
} }
fn rotate_view( fn rotate_view_gamepad(
controls: Res<Controls>,
// todo: Put the player head as a child of the rig to avoid this mess:
mut player: Query<&mut Transform, With<PlayerRig>>,
) {
let Some(gamepad) = controls.gamepad_state else {
return;
};
if gamepad.view_mode {
return;
}
for mut tr in &mut player {
tr.rotate_y(gamepad.look_dir.x * -0.001);
}
}
fn rotate_view_keyboard(
mut controls: ResMut<Controls>, mut controls: ResMut<Controls>,
// todo: Put the player head as a child of the rig to avoid this mess: // todo: Put the player head as a child of the rig to avoid this mess:
mut player: Query<&mut Transform, With<PlayerRig>>, mut player: Query<&mut Transform, With<PlayerRig>>,
@@ -137,10 +155,6 @@ fn rotate_view(
for mut tr in &mut player { for mut tr in &mut player {
tr.rotate_y(controls.keyboard_state.look_dir.x * -0.001); tr.rotate_y(controls.keyboard_state.look_dir.x * -0.001);
if let Some(gamepad) = controls.gamepad_state {
tr.rotate_y(gamepad.look_dir.x * -0.001);
}
} }
controls.keyboard_state.look_dir = Vec2::ZERO; controls.keyboard_state.look_dir = Vec2::ZERO;