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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
use sdl2::event::{Event, WindowEvent};
use sdl2::keyboard::Scancode;
use sdl2::{EventPump, Sdl};
use specs::prelude::*;
use crate::components::{Player, Velocity};
pub const PLAYER_SPEED: f64 = 150.;
pub const ACTION_KEY_UP: u8 = 0b0001;
pub const ACTION_KEY_LEFT: u8 = 0b0010;
pub const ACTION_KEY_DOWN: u8 = 0b0100;
pub const ACTION_KEY_RIGHT: u8 = 0b1000;
pub struct SysInput
{
pressed_action_keys: u8,
event_pump: EventPump,
}
impl SysInput
{
pub fn new(sdl: &Sdl) -> Self
{
Self {
pressed_action_keys: 0b0,
event_pump: sdl.event_pump().unwrap(),
}
}
}
impl<'a> System<'a> for SysInput
{
type SystemData = (WriteStorage<'a, Velocity>, ReadStorage<'a, Player>);
fn run(&mut self, (mut vel, player): Self::SystemData)
{
let mut player_movement_changed = false;
for event in self.event_pump.poll_iter() {
match event {
Event::Quit { .. } => {
panic!("Quitting due to exit signal");
},
Event::Window {
win_event: WindowEvent::Resized(x, y),
..
} => {
println!("Window resized to {}x{}", x, y);
},
Event::KeyDown { scancode, .. } => match scancode {
Some(Scancode::W) => {
self.pressed_action_keys |= ACTION_KEY_UP;
player_movement_changed = true;
},
Some(Scancode::A) => {
self.pressed_action_keys |= ACTION_KEY_LEFT;
player_movement_changed = true;
},
Some(Scancode::S) => {
self.pressed_action_keys |= ACTION_KEY_DOWN;
player_movement_changed = true;
},
Some(Scancode::D) => {
self.pressed_action_keys |= ACTION_KEY_RIGHT;
player_movement_changed = true;
},
key => {
println!("keydown received: {:?}", key)
},
},
Event::KeyUp { scancode, .. } => match scancode {
Some(Scancode::W) => {
self.pressed_action_keys &= !ACTION_KEY_UP;
player_movement_changed = true;
},
Some(Scancode::A) => {
self.pressed_action_keys &= !ACTION_KEY_LEFT;
player_movement_changed = true;
},
Some(Scancode::S) => {
self.pressed_action_keys &= !ACTION_KEY_DOWN;
player_movement_changed = true;
},
Some(Scancode::D) => {
self.pressed_action_keys &= !ACTION_KEY_RIGHT;
player_movement_changed = true;
},
_ => {},
},
_ => {},
}
}
/* Update player movement */
if player_movement_changed {
for (vel, _player) in (&mut vel, &player).join() {
/* Vertical movement */
if (self.pressed_action_keys & ACTION_KEY_UP) != 0 {
vel.0.y = -PLAYER_SPEED;
}
else if (self.pressed_action_keys & ACTION_KEY_DOWN) != 0 {
vel.0.y = PLAYER_SPEED;
}
else {
vel.0.y = 0.;
}
/* Horizontal movement */
if (self.pressed_action_keys & ACTION_KEY_LEFT) != 0 {
vel.0.x = -PLAYER_SPEED;
}
else if (self.pressed_action_keys & ACTION_KEY_RIGHT) != 0 {
vel.0.x = PLAYER_SPEED;
}
else {
vel.0.x = 0.;
}
}
}
}
}
|