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
122
123
124
|
extern crate sdl2;
extern crate std;
use super::state;
use super::constants;
pub struct Player {
pub x: i32,
pub y: i32,
left_p: bool,
right_p: bool,
up_p: bool,
down_p: bool,
shift_p: bool,
y_d: i32,
x_d: i32,
pub fire_rate: u32,
}
impl Player {
pub fn new() -> Player {
Player { x: 400, y: 500, x_d: 0, y_d: 0, down_p: false, left_p: false, right_p: false, up_p: false, fire_rate: 15, shift_p: false }
}
pub fn act(&mut self, events: &mut sdl2::event::EventPollIterator) -> Result<(), ()> {
for event in events {
match event {
sdl2::event::Event::Quit {..} => {
return Err(());
}
sdl2::event::Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::Down), .. } => {
self.down_p = true;
self.y_d = -1;
}
sdl2::event::Event::KeyUp { keycode: Some(sdl2::keyboard::Keycode::Down), .. } => {
self.down_p = false;
}
sdl2::event::Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::Up), .. } => {
self.up_p = true;
self.y_d = 1;
}
sdl2::event::Event::KeyUp { keycode: Some(sdl2::keyboard::Keycode::Up), .. } => {
self.up_p = false;
}
sdl2::event::Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::Left), .. } => {
self.left_p = true;
self.x_d = -1;
}
sdl2::event::Event::KeyUp { keycode: Some(sdl2::keyboard::Keycode::Left), .. } => {
self.left_p = false;
}
sdl2::event::Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::Right), .. } => {
self.right_p = true;
self.x_d = 1;
}
sdl2::event::Event::KeyUp { keycode: Some(sdl2::keyboard::Keycode::Right), .. } => {
self.right_p = false;
}
sdl2::event::Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::LShift), .. } |
sdl2::event::Event::KeyDown { keycode: Some(sdl2::keyboard::Keycode::RShift), .. } => {
self.shift_p = true;
}
sdl2::event::Event::KeyUp { keycode: Some(sdl2::keyboard::Keycode::LShift), .. } |
sdl2::event::Event::KeyUp { keycode: Some(sdl2::keyboard::Keycode::RShift), .. } => {
self.shift_p = false;
}
_ => { },
}
}
if self.left_p {
if !self.right_p {
self.x_d = -1;
}
} else if self.right_p {
self.x_d = 1;
} else {
self.x_d = 0;
}
if self.up_p {
if !self.down_p {
self.y_d = -1;
}
} else if self.down_p {
self.y_d = 1;
} else {
self.y_d = 0;
}
/* Don't go off the side */
if self.x_d < 0 && self.x <= 0 {
self.x_d = 0;
}
else if self.x >= constants::X_DIM as i32 && self.x_d > 0 {
self.x_d = 0;
}
if self.y <= 0 && self.y_d < 0 {
self.y_d = 0;
}
else if self.y >= constants::Y_DIM as i32 && self.y_d > 0 {
self.y_d = 0;
}
self.x += if self.shift_p { self.x_d } else { self.x_d * 3 };
self.y += if self.shift_p { self.y_d } else { self.y_d * 3 };
return Ok(())
}
}
impl state::Positioned for Player {
fn x(&self) -> i32 {
self.x
}
fn y(&self) -> i32 {
self.y
}
fn radius() -> u32 {
13
}
}
impl state::Drawable for Player {
fn center() -> (u32, u32) {
(30, 19)
}
}
|