improve controller (#5)

This commit is contained in:
extrawurst
2025-03-08 16:57:21 +01:00
committed by GitHub
parent 6cf7216ef4
commit 79c6dad949
2 changed files with 22 additions and 17 deletions

View File

@@ -50,7 +50,7 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
let head_02 = asset_server.load("ui/heads/commando.png"); let head_02 = asset_server.load("ui/heads/commando.png");
let head_03 = asset_server.load("ui/heads/goblin.png"); let head_03 = asset_server.load("ui/heads/goblin.png");
let head_04 = asset_server.load("ui/heads/highland hammer thrower.png"); let head_04 = asset_server.load("ui/heads/highland hammer thrower.png");
let head_05 = asset_server.load("ui/heads/legionaire.png"); let head_05 = asset_server.load("ui/heads/legionnaire.png");
commands.insert_resource(HeadsImages { commands.insert_resource(HeadsImages {
heads: vec![head_01, head_02, head_03, head_04, head_05], heads: vec![head_01, head_02, head_03, head_04, head_05],

View File

@@ -1,4 +1,4 @@
use std::time::Duration; use std::{f32::consts::PI, time::Duration};
use crate::{ use crate::{
DebugVisuals, DebugVisuals,
@@ -27,6 +27,9 @@ struct PlayerAnimations;
#[derive(Component, Default)] #[derive(Component, Default)]
struct PlayerHead; struct PlayerHead;
#[derive(Component, Default)]
struct PlayerRig;
#[derive(Resource, Default)] #[derive(Resource, Default)]
struct PlayerSpawned { struct PlayerSpawned {
spawned: bool, spawned: bool,
@@ -101,6 +104,7 @@ fn spawn(
)) ))
.with_child(( .with_child((
Name::from("body rig"), Name::from("body rig"),
PlayerRig,
Transform::from_translation(Vec3::new(0., -3., 0.)) Transform::from_translation(Vec3::new(0., -3., 0.))
.with_rotation(Quat::from_rotation_y(std::f32::consts::PI)) .with_rotation(Quat::from_rotation_y(std::f32::consts::PI))
.with_scale(Vec3::splat(1.5)), .with_scale(Vec3::splat(1.5)),
@@ -117,14 +121,13 @@ fn spawn(
fn cursor_events( fn cursor_events(
mut mouse: EventReader<MouseMotion>, mut mouse: EventReader<MouseMotion>,
mut player: Query<&mut Transform, With<Player>>, // todo: Put the player head as a child of the rig to avoid this mess:
mut player: Query<&mut Transform, Or<(With<PlayerRig>, With<PlayerHead>)>>,
) { ) {
let Ok(mut player) = player.get_single_mut() else {
return;
};
for ev in mouse.read() { for ev in mouse.read() {
player.rotate_y(ev.delta.x * -0.001); for mut tr in &mut player {
tr.rotate_y(ev.delta.x * -0.001);
}
} }
} }
@@ -152,7 +155,7 @@ fn initial_grab_cursor(mut primary_window: Query<&mut Window, With<PrimaryWindow
fn apply_controls( fn apply_controls(
keyboard: Res<ButtonInput<KeyCode>>, keyboard: Res<ButtonInput<KeyCode>>,
mut query: Query<&mut TnuaController>, mut query: Query<&mut TnuaController>,
player: Query<&Transform, With<Player>>, player: Query<&Transform, With<PlayerRig>>,
mut controls: ResMut<PlayerMovement>, mut controls: ResMut<PlayerMovement>,
) { ) {
let Ok(mut controller) = query.get_single_mut() else { let Ok(mut controller) = query.get_single_mut() else {
@@ -166,16 +169,16 @@ fn apply_controls(
let mut direction = Vec3::ZERO; let mut direction = Vec3::ZERO;
if keyboard.pressed(KeyCode::KeyW) { if keyboard.pressed(KeyCode::KeyW) {
direction = player.forward().as_vec3();
}
if keyboard.pressed(KeyCode::KeyS) {
direction = player.forward().as_vec3() * -1.; direction = player.forward().as_vec3() * -1.;
} }
if keyboard.pressed(KeyCode::KeyS) {
direction = player.forward().as_vec3();
}
if keyboard.pressed(KeyCode::KeyA) { if keyboard.pressed(KeyCode::KeyA) {
direction += player.left().as_vec3(); direction += player.right().as_vec3();
} }
if keyboard.pressed(KeyCode::KeyD) { if keyboard.pressed(KeyCode::KeyD) {
direction += player.right().as_vec3(); direction += player.left().as_vec3();
} }
if controls.any_direction != (direction != Vec3::ZERO) { if controls.any_direction != (direction != Vec3::ZERO) {
@@ -206,7 +209,7 @@ fn apply_controls(
} }
fn update_camera( fn update_camera(
player: Query<&Transform, With<Player>>, player: Query<&GlobalTransform, With<PlayerRig>>,
mut rig: Single<&mut Rig>, mut rig: Single<&mut Rig>,
res: Res<DebugVisuals>, res: Res<DebugVisuals>,
) { ) {
@@ -218,8 +221,10 @@ fn update_camera(
return; return;
} }
rig.driver_mut::<GameCameraRig>() rig.driver_mut::<GameCameraRig>().set_position_target(
.set_position_target(player.translation, player.rotation); player.translation(),
player.rotation() * Quat::from_rotation_y(PI),
);
} }
fn collect_cash( fn collect_cash(