64 lines
1.9 KiB
Rust
64 lines
1.9 KiB
Rust
/*
|
|
Trouble in Terror Town: Community Edition
|
|
Copyright (C) 2024 Mikolaj Wojciech Gorski
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License 3.0 as published by
|
|
the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
See the GNU General Public License 3.0 for more details.
|
|
|
|
You should have received a copy of the GNU General Public License 3.0
|
|
along with this program. If not, see <https://www.gnu.org/licenses/gpl-3.0.html>.
|
|
*/
|
|
|
|
use bevy::prelude::*;
|
|
use bevy_xpbd_3d::{math::*, prelude::*};
|
|
|
|
#[derive(Event)]
|
|
pub enum MovementAction {
|
|
Move(Vector2),
|
|
Jump,
|
|
}
|
|
|
|
#[derive(Event)]
|
|
pub enum LookAction{
|
|
Mouse(Vec2),
|
|
Gamepad(Vec2)
|
|
}
|
|
|
|
pub struct InputProcessorPlugin;
|
|
|
|
impl Plugin for InputProcessorPlugin {
|
|
fn build(&self, app: &mut App) {
|
|
app.add_systems(Update, keyboard_input);
|
|
app.add_event::<LookAction>();
|
|
app.add_event::<MovementAction>();
|
|
}
|
|
}
|
|
|
|
fn keyboard_input(
|
|
mut movement_event_writer: EventWriter<MovementAction>,
|
|
keyboard_input: Res<ButtonInput<KeyCode>>,
|
|
) {
|
|
let up = keyboard_input.any_pressed([KeyCode::KeyW, KeyCode::ArrowUp]);
|
|
let down = keyboard_input.any_pressed([KeyCode::KeyS, KeyCode::ArrowDown]);
|
|
let left = keyboard_input.any_pressed([KeyCode::KeyA, KeyCode::ArrowLeft]);
|
|
let right = keyboard_input.any_pressed([KeyCode::KeyD, KeyCode::ArrowRight]);
|
|
|
|
let horizontal = right as i8 - left as i8;
|
|
let vertical = up as i8 - down as i8;
|
|
let direction = Vector2::new(horizontal as Scalar, vertical as Scalar).clamp_length_max(1.0);
|
|
|
|
if direction != Vector2::ZERO {
|
|
movement_event_writer.send(MovementAction::Move(direction));
|
|
}
|
|
|
|
if keyboard_input.just_pressed(KeyCode::Space) {
|
|
movement_event_writer.send(MovementAction::Jump);
|
|
}
|
|
}
|
|
|