swap heads on gamepad

This commit is contained in:
2025-03-19 23:44:37 +01:00
parent b4013b4eb0
commit 73e1a88688
2 changed files with 40 additions and 24 deletions

View File

@@ -1,3 +1,4 @@
use crate::{heads_ui::SwapHead, shooting::TriggerState};
use bevy::{ use bevy::{
input::{ input::{
ButtonState, ButtonState,
@@ -7,8 +8,6 @@ use bevy::{
prelude::*, prelude::*,
}; };
use crate::shooting::TriggerState;
#[derive(Resource, Debug, Clone, Copy, Default, PartialEq)] #[derive(Resource, Debug, Clone, Copy, Default, PartialEq)]
pub struct ControlState { pub struct ControlState {
pub move_dir: Vec2, pub move_dir: Vec2,
@@ -77,15 +76,21 @@ fn gamepad_controls(
move_dir: gamepad.left_stick(), move_dir: gamepad.left_stick(),
look_dir, look_dir,
jump: gamepad.pressed(GamepadButton::South), jump: gamepad.pressed(GamepadButton::South),
view_mode: gamepad.pressed(GamepadButton::East), view_mode: gamepad.pressed(GamepadButton::LeftTrigger2),
}; };
if gamepad.just_pressed(GamepadButton::North) { if gamepad.just_pressed(GamepadButton::RightTrigger2) {
commands.trigger(TriggerState::Active); commands.trigger(TriggerState::Active);
} }
if gamepad.just_released(GamepadButton::North) { if gamepad.just_released(GamepadButton::RightTrigger2) {
commands.trigger(TriggerState::Inactive); commands.trigger(TriggerState::Inactive);
} }
if gamepad.just_pressed(GamepadButton::LeftTrigger) {
commands.trigger(SwapHead::Left);
}
if gamepad.just_pressed(GamepadButton::RightTrigger) {
commands.trigger(SwapHead::Right);
}
if controls if controls
.gamepad_state .gamepad_state
@@ -104,7 +109,11 @@ fn mouse_rotate(mut mouse: EventReader<MouseMotion>, mut controls: ResMut<Contro
} }
} }
fn keyboard_controls(keyboard: Res<ButtonInput<KeyCode>>, mut controls: ResMut<Controls>) { fn keyboard_controls(
mut commands: Commands,
keyboard: Res<ButtonInput<KeyCode>>,
mut controls: ResMut<Controls>,
) {
let mut direction = Vec2::ZERO; let mut direction = Vec2::ZERO;
if keyboard.pressed(KeyCode::KeyW) { if keyboard.pressed(KeyCode::KeyW) {
@@ -120,6 +129,13 @@ fn keyboard_controls(keyboard: Res<ButtonInput<KeyCode>>, mut controls: ResMut<C
direction += Vec2::X; direction += Vec2::X;
} }
if keyboard.just_pressed(KeyCode::KeyQ) {
commands.trigger(SwapHead::Left);
}
if keyboard.just_pressed(KeyCode::KeyE) {
commands.trigger(SwapHead::Right);
}
controls.keyboard_state.move_dir = direction; controls.keyboard_state.move_dir = direction;
controls.keyboard_state.jump = keyboard.pressed(KeyCode::Space); controls.keyboard_state.jump = keyboard.pressed(KeyCode::Space);
controls.keyboard_state.view_mode = keyboard.pressed(KeyCode::Tab); controls.keyboard_state.view_mode = keyboard.pressed(KeyCode::Tab);

View File

@@ -1,5 +1,11 @@
use bevy::prelude::*; use bevy::prelude::*;
#[derive(Event, Reflect)]
pub enum SwapHead {
Left,
Right,
}
#[derive(Component, Reflect, Default)] #[derive(Component, Reflect, Default)]
#[reflect(Component)] #[reflect(Component)]
struct HeadSelector(pub usize); struct HeadSelector(pub usize);
@@ -29,7 +35,8 @@ pub struct HeadChanged(pub usize);
pub fn plugin(app: &mut App) { pub fn plugin(app: &mut App) {
app.register_type::<HeadDamage>(); app.register_type::<HeadDamage>();
app.add_systems(Startup, setup); app.add_systems(Startup, setup);
app.add_systems(Update, (update, toggle_heads)); app.add_systems(Update, update);
app.add_observer(on_swap_head);
} }
fn setup(mut commands: Commands, asset_server: Res<AssetServer>) { fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
@@ -181,22 +188,15 @@ fn update(
} }
} }
fn toggle_heads( fn on_swap_head(trigger: Trigger<SwapHead>, mut commands: Commands, mut res: ResMut<ActiveHeads>) {
mut commands: Commands, match trigger.event() {
mut res: ResMut<ActiveHeads>, SwapHead::Right => {
keys: Res<ButtonInput<KeyCode>>, res.current_slot = (res.current_slot + 1) % 5;
) { }
let changed = if keys.just_pressed(KeyCode::KeyE) { SwapHead::Left => {
res.current_slot = (res.current_slot + 1) % 5; res.current_slot = (res.current_slot + 4) % 5;
true }
} else if keys.just_pressed(KeyCode::KeyQ) {
res.current_slot = (res.current_slot + 4) % 5;
true
} else {
false
};
if changed {
commands.trigger(HeadChanged(res.heads[res.current_slot].unwrap()));
} }
commands.trigger(HeadChanged(res.heads[res.current_slot].unwrap()));
} }