blob: fa2d0e8254d368827a4fc5eca5ec080ef6b4ae41 (
plain)
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
|
#include "camera.h"
#include <math.h>
void init_camera(Camera* camera) {
camera->pos.x = 3;
camera->pos.y = 3;
camera->angle = PI / 4;
camera->fov = PI / 4;
}
#define MOVE_SPEED 1
#define ROTATE_SPEED PI / 2
#define FOV_CHANGE_SPEED .5
#define PLAYER_SIZE .1
void update_camera(Camera* camera, Screen* screen) {
double rotate = 0;
if (key_down(KEY_LEFT))
rotate -= ROTATE_SPEED;
if (key_down(KEY_RIGHT))
rotate += ROTATE_SPEED;
rotate *= screen->delta;
rotate += camera->angle;
while (rotate >= PI2) rotate -= PI2;
while (rotate < 0) rotate += PI2;
camera->angle = rotate;
v2 forward = { cos(camera->angle), sin(camera->angle) };
v2 left = { forward.y, -forward.x };
v2 move = { 0, 0 };
if (key_down(KEY_W)) {
move.x += forward.x;
move.y += forward.y;
}
if (key_down(KEY_S)) {
move.x -= forward.x;
move.y -= forward.y;
}
if (key_down(KEY_A)) {
move.x += left.x;
move.y += left.y;
}
if (key_down(KEY_D)) {
move.x -= left.x;
move.y -= left.y;
}
if (key_down(KEY_EQUALS)) {
camera->fov += FOV_CHANGE_SPEED * screen->delta;
}
if (key_down(KEY_MINUS)) {
camera->fov -= FOV_CHANGE_SPEED * screen->delta;
}
v2 hit_pos;
bool movex, movey;
cast_ray(camera->pos, sign(move.x) == 1 ? 0 : PI, &hit_pos);
movex = v2_dist(hit_pos, camera->pos) > PLAYER_SIZE;
cast_ray(camera->pos, sign(move.y) == 1 ? PIH : -PIH, &hit_pos);
movey = v2_dist(hit_pos, camera->pos) > PLAYER_SIZE;
if (movex) camera->pos.x += move.x * MOVE_SPEED * screen->delta;
if (movey) camera->pos.y += move.y * MOVE_SPEED * screen->delta;
}
|