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::{
input::{
ButtonState,
@@ -7,8 +8,6 @@ use bevy::{
prelude::*,
};
use crate::shooting::TriggerState;
#[derive(Resource, Debug, Clone, Copy, Default, PartialEq)]
pub struct ControlState {
pub move_dir: Vec2,
@@ -77,15 +76,21 @@ fn gamepad_controls(
move_dir: gamepad.left_stick(),
look_dir,
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);
}
if gamepad.just_released(GamepadButton::North) {
if gamepad.just_released(GamepadButton::RightTrigger2) {
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
.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;
if keyboard.pressed(KeyCode::KeyW) {
@@ -120,6 +129,13 @@ fn keyboard_controls(keyboard: Res<ButtonInput<KeyCode>>, mut controls: ResMut<C
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.jump = keyboard.pressed(KeyCode::Space);
controls.keyboard_state.view_mode = keyboard.pressed(KeyCode::Tab);

View File

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