-
Notifications
You must be signed in to change notification settings - Fork 1
/
sys_control_keyboard.ts
75 lines (67 loc) · 2.33 KB
/
sys_control_keyboard.ts
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
/**
* # sys_control_keyboard
*
* Handle keyboard input.
*/
import {quat_get_pitch, quat_multiply} from "../../lib/quat.js";
import {Entity} from "../../lib/world.js";
import {Game} from "../game.js";
import {Has} from "../world.js";
const QUERY = Has.Move | Has.ControlPlayer;
export function sys_control_keyboard(game: Game, delta: number) {
for (let i = 0; i < game.World.Signature.length; i++) {
if ((game.World.Signature[i] & QUERY) === QUERY) {
update(game, i);
}
}
}
function update(game: Game, entity: Entity) {
let control = game.World.ControlPlayer[entity];
if (control.Move) {
let move = game.World.Move[entity];
if (game.InputState["KeyW"]) {
// Move forward
move.Direction[2] += 1;
}
if (game.InputState["KeyA"]) {
// Strafe left
move.Direction[0] += 1;
}
if (game.InputState["KeyS"]) {
// Move backward
move.Direction[2] -= 1;
}
if (game.InputState["KeyD"]) {
// Strafe right
move.Direction[0] -= 1;
}
}
if (control.Yaw) {
// Yaw is applied relative to the entity's local space; the Y axis is
// not affected by its current orientation.
let move = game.World.Move[entity];
if (game.InputState["ArrowLeft"]) {
// Look left.
quat_multiply(move.LocalRotation, move.LocalRotation, [0, 1, 0, 0]);
}
if (game.InputState["ArrowRight"]) {
// Look right.
quat_multiply(move.LocalRotation, move.LocalRotation, [0, -1, 0, 0]);
}
}
if (control.Pitch) {
// Pitch is applied relative to the entity's self space; the X axis is
// always aligned with its left and right sides.
let transform = game.World.Transform[entity];
let move = game.World.Move[entity];
let current_pitch = quat_get_pitch(transform.Rotation);
if (game.InputState["ArrowUp"] && current_pitch > control.MinPitch) {
// Look up.
quat_multiply(move.SelfRotation, move.SelfRotation, [-1, 0, 0, 0]);
}
if (game.InputState["ArrowDown"] && current_pitch < control.MaxPitch) {
// Look down.
quat_multiply(move.SelfRotation, move.SelfRotation, [1, 0, 0, 0]);
}
}
}