summaryrefslogtreecommitdiff
path: root/simple-raycaster/src/player.c
diff options
context:
space:
mode:
Diffstat (limited to 'simple-raycaster/src/player.c')
-rw-r--r--simple-raycaster/src/player.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/simple-raycaster/src/player.c b/simple-raycaster/src/player.c
new file mode 100644
index 0000000..f2d9883
--- /dev/null
+++ b/simple-raycaster/src/player.c
@@ -0,0 +1,44 @@
+#include <GLFW/glfw3.h>
+#include <math.h>
+
+#include "player.h"
+
+void move_player(Player *player, GLFWwindow* window, double* mouse_x, double* mouse_y, double width, double height) {
+ if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
+ player->pos_x += player->dir_x * player->move_speed;
+ player->pos_y += player->dir_y * player->move_speed;
+ }
+ if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) {
+ player->pos_x -= player->dir_x * player->move_speed;
+ player->pos_y -= player->dir_y * player->move_speed;
+ }
+ if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) {
+ player->pos_x += player->dir_y * player->move_speed;
+ player->pos_y -= player->dir_x * player->move_speed;
+ }
+ if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) {
+ player->pos_x -= player->dir_y * player->move_speed;
+ player->pos_y += player->dir_x * player->move_speed;
+ }
+
+ // mouse controls (including y-shearing angle calculations
+ // DO NOT TOUCH, THIS TOOK A WHOLE NIGHT TO FIGURE OUT
+ double mouse_dx, mouse_dy;
+ double old_mouse_x, old_mouse_y;
+ old_mouse_x = *mouse_x;
+ old_mouse_y = *mouse_y;
+ glfwGetCursorPos(window, mouse_x, mouse_y);
+ mouse_dx = *mouse_x - old_mouse_x;
+ mouse_dy = *mouse_y - old_mouse_y;
+ double rot_speed = mouse_dx * player->sensitivity;
+ double old_dir_x = player->dir_x;
+ player->dir_x = player->dir_x * cos(rot_speed) - player->dir_y * sin(rot_speed);
+ player->dir_y = old_dir_x * sin(rot_speed) + player->dir_y * cos(rot_speed);
+ double old_plane_x = player->plane_x;
+ player->plane_x = player->plane_x * cos(rot_speed) - player->plane_y * sin(rot_speed);
+ player->plane_y = old_plane_x * sin(rot_speed) + player->plane_y * cos(rot_speed);
+ player->look_angle += mouse_dy * player->sensitivity;
+ if (player->look_angle > M_PI/4) { player->look_angle = M_PI/4; }
+ if (player->look_angle < -M_PI/4) { player->look_angle = -M_PI/4; }
+
+}