80 lines
2.4 KiB
Rust
80 lines
2.4 KiB
Rust
use bevy::{prelude::*, window::CursorGrabMode};
|
|
use bevy_rapier3d::prelude::*;
|
|
|
|
use crate::logic::core::player::player_movement::{
|
|
move_player, PlayerLinearXZState, PlayerLinearYState, PlayerMovementInput,
|
|
};
|
|
|
|
use super::markers::player::Player;
|
|
|
|
/// System that captures input and fires events
|
|
pub fn capture_input(
|
|
keyboard_input: Res<Input<KeyCode>>,
|
|
player_query: Query<
|
|
(
|
|
&mut Velocity,
|
|
&mut ExternalImpulse,
|
|
&mut PlayerLinearYState,
|
|
&mut PlayerLinearXZState,
|
|
&Transform,
|
|
&mut Damping,
|
|
),
|
|
With<Player>,
|
|
>,
|
|
time: Res<Time>,
|
|
) {
|
|
// Don't allocate on each frame. Instead Check if any of the inputs are being pressed and then allocate.
|
|
if keyboard_input.any_pressed([
|
|
KeyCode::A,
|
|
KeyCode::S,
|
|
KeyCode::D,
|
|
KeyCode::W,
|
|
KeyCode::C,
|
|
KeyCode::Space,
|
|
]) || keyboard_input.any_just_released([
|
|
KeyCode::A,
|
|
KeyCode::S,
|
|
KeyCode::D,
|
|
KeyCode::W,
|
|
KeyCode::C,
|
|
KeyCode::Space,
|
|
]) {
|
|
let player_movement_input = PlayerMovementInput {
|
|
up: keyboard_input.just_pressed(KeyCode::Space),
|
|
down: keyboard_input.just_pressed(KeyCode::C),
|
|
left: keyboard_input.pressed(KeyCode::A),
|
|
right: keyboard_input.pressed(KeyCode::D),
|
|
front: keyboard_input.pressed(KeyCode::W),
|
|
back: keyboard_input.pressed(KeyCode::S),
|
|
sprint: keyboard_input.pressed(KeyCode::ShiftLeft),
|
|
};
|
|
move_player(player_movement_input, player_query, time);
|
|
}
|
|
}
|
|
|
|
pub fn capture_cursor(
|
|
mut windows: Query<&mut Window>,
|
|
btn: Res<Input<MouseButton>>,
|
|
key: Res<Input<KeyCode>>,
|
|
) {
|
|
let mut window = windows.single_mut();
|
|
|
|
if btn.just_pressed(MouseButton::Left) {
|
|
// if you want to use the cursor, but not let it leave the window,
|
|
// use `Confined` mode:
|
|
// window.cursor.grab_mode = CursorGrabMode::Confined;
|
|
|
|
// for a game that doesn't use the cursor (like a shooter):
|
|
// use `Locked` mode to keep the cursor in one place
|
|
window.cursor.grab_mode = CursorGrabMode::Locked;
|
|
// also hide the cursor
|
|
window.cursor.visible = false;
|
|
}
|
|
|
|
if key.just_pressed(KeyCode::Escape) {
|
|
window.cursor.grab_mode = CursorGrabMode::None;
|
|
// also hide the cursor
|
|
window.cursor.visible = true;
|
|
}
|
|
}
|