-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathstate.rs
More file actions
85 lines (75 loc) · 2.13 KB
/
state.rs
File metadata and controls
85 lines (75 loc) · 2.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use bevy::input::ButtonState;
use bevy::input::keyboard::KeyboardInput;
use bevy::input::mouse::{MouseButton, MouseButtonInput};
use bevy::prelude::*;
use bevy::window::CursorMoved;
use bevy::input::keyboard::KeyCode;
#[derive(Component, Default)]
pub struct CursorPosition {
current: Vec2,
previous: Vec2,
}
impl CursorPosition {
pub fn current(&self) -> Vec2 {
self.current
}
pub fn previous(&self) -> Vec2 {
self.previous
}
}
#[derive(Resource, Default)]
pub struct LastKey {
pub code: Option<KeyCode>,
pub character: Option<char>,
pub just_pressed: bool,
pub just_released: bool,
}
#[derive(Resource, Default)]
pub struct LastMouseButton {
pub button: Option<MouseButton>,
}
pub fn snapshot_cursor(mut query: Query<&mut CursorPosition>) {
for mut cursor in &mut query {
cursor.previous = cursor.current;
}
}
pub fn track_cursor_position(
mut reader: MessageReader<CursorMoved>,
mut query: Query<&mut CursorPosition>,
) {
for event in reader.read() {
if let Ok(mut cursor) = query.get_mut(event.window) {
cursor.current = event.position;
}
}
}
pub fn track_last_key(mut reader: MessageReader<KeyboardInput>, mut last: ResMut<LastKey>) {
// our cbs fire on key auto repeats but bevy just_pressed only fires on the initial press
// we track edge state off of the raw input stream
last.just_pressed = false;
last.just_released = false;
for event in reader.read() {
match event.state {
ButtonState::Pressed => {
last.code = Some(event.key_code);
last.character = event.text.as_ref().and_then(|t| t.chars().next());
last.just_pressed = true;
}
ButtonState::Released => {
last.just_released = true;
}
}
}
}
pub fn track_last_mouse_button(
mut reader: MessageReader<MouseButtonInput>,
mut last: ResMut<LastMouseButton>,
) {
if let Some(event) = reader
.read()
.filter(|e| e.state == ButtonState::Pressed)
.last()
{
last.button = Some(event.button);
}
}