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
|
use sdl2::*;
type ControlKey = struct {
key: Key,
pressed: bool,
};
let CONTROL_KEY_FORWARD = ControlKey { key = KEY_W, ... };
let CONTROL_KEY_BACKWARD = ControlKey { key = KEY_S, ... };
let CONTROL_KEY_LEFT = ControlKey { key = KEY_A, ... };
let CONTROL_KEY_RIGHT = ControlKey { key = KEY_D, ... };
let CONTROL_KEY_JUMP = ControlKey { key = KEY_SPACE, ... };
let CONTROL_KEY_SNEAK = ControlKey { key = KEY_LSHIFT, ... };
const CONTROL_KEYS = [
&CONTROL_KEY_FORWARD,
&CONTROL_KEY_BACKWARD,
&CONTROL_KEY_LEFT,
&CONTROL_KEY_RIGHT,
&CONTROL_KEY_JUMP,
&CONTROL_KEY_SNEAK,
];
fn control_input(event: InputEvent) void = {
match (event) {
case CancelEvent =>
for (let i = 0z; i < len(CONTROL_KEYS); i += 1) {
CONTROL_KEYS[i].pressed = false;
};
case let event: KeyEvent =>
const pressed = switch (event.status) {
case ButtonStatus::DOWN, ButtonStatus::HELD =>
yield true;
case ButtonStatus::UP =>
yield false;
};
for (let i = 0z; i < len(CONTROL_KEYS); i += 1) {
if (CONTROL_KEYS[i].key == event.key) {
CONTROL_KEYS[i].pressed = pressed;
};
};
case => void;
};
};
type Control = struct {
yaw: f32,
pitch: f32,
walk: f32,
strafe: f32,
jump: bool,
sneak: bool,
};
def MOUSE_SENSITIVITY = 0.115f32;
fn control_frame() void = {
let mx = 0, my = 0;
SDL_GetRelativeMouseState(&mx, &my);
player_control(&Control {
yaw = mx: f32 * MOUSE_SENSITIVITY,
pitch = my: f32 * MOUSE_SENSITIVITY,
walk = (if (CONTROL_KEY_FORWARD.pressed) 1.0f32 else 0.0f32)
- (if (CONTROL_KEY_BACKWARD.pressed) 1.0f32 else 0.0f32),
strafe = (if (CONTROL_KEY_LEFT.pressed) 1.0f32 else 0.0f32)
- (if (CONTROL_KEY_RIGHT.pressed) 1.0f32 else 0.0f32),
jump = CONTROL_KEY_JUMP.pressed,
sneak = CONTROL_KEY_SNEAK.pressed,
});
};
|