aboutsummaryrefslogtreecommitdiffstats
path: root/src/player.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/player.c')
-rw-r--r--src/player.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/player.c b/src/player.c
new file mode 100644
index 0000000..ec6eaf2
--- /dev/null
+++ b/src/player.c
@@ -0,0 +1,75 @@
+#include "player.h"
+#include "game.h"
+
+Player createPlayer()
+{
+ return (Player){
+ .position = Vector3Zero(),
+ .direction = (Vector3){0.0, 0.0, 0.0},
+ .velocity = Vector3Zero(),
+ .camera = (Camera){
+ .position = (Vector3){0.0, 0.0, 0.0},
+ .target = Vector3Zero(),
+ .up = (Vector3){0.0, 1.0, 0.0},
+ .fovy = 100,
+ .projection = CAMERA_PERSPECTIVE
+ },
+ .cameraAngle = Vector2Zero()
+ };
+}
+
+// TODO: move magic numbers to settings
+void updatePlayer(Player* player, Game* game)
+{
+ Camera* camera = &player->camera;
+ Vector2* cameraAngle = &player->cameraAngle;
+ Settings* settings = &game->settings;
+
+ // Get mouse speed.
+ Vector2 mouseSpeed = Vector2Scale(GetMouseDelta(), settings->mouseSpeed);
+ mouseSpeed = Vector2Scale(mouseSpeed, 1.0 / (PI * 2.0));
+
+ // Update camera angle.
+ *cameraAngle = Vector2Add(*cameraAngle, mouseSpeed);
+ cameraAngle->x = Wrap(cameraAngle->x, -PI, PI);
+ cameraAngle->y = Clamp(cameraAngle->y, -PI / 2.5, PI / 2.5);
+
+ // Set player direction
+ Matrix matrix = MatrixRotateXYZ(
+ (Vector3){-cameraAngle->y, cameraAngle->x, 0.0});
+ player->direction = (Vector3){matrix.m2, matrix.m6, matrix.m10};
+
+ // Player movement.
+ player->velocity = Vector3Zero();
+
+ if (IsKeyDown(settings->forwardKey))
+ {
+ player->velocity.z += cosf(cameraAngle->x);
+ player->velocity.x += -sinf(cameraAngle->x);
+ }
+ if (IsKeyDown(settings->leftKey))
+ {
+ player->velocity.z += cosf(cameraAngle->x - (PI / 2.0));
+ player->velocity.x += -sinf(cameraAngle->x - (PI / 2.0));
+ }
+ if (IsKeyDown(settings->backwardKey))
+ {
+ player->velocity.z += -cosf(cameraAngle->x);
+ player->velocity.x += sinf(cameraAngle->x);
+ }
+ if (IsKeyDown(settings->rightKey))
+ {
+ player->velocity.z += cosf(cameraAngle->x + (PI / 2.0));
+ player->velocity.x += -sinf(cameraAngle->x + (PI / 2.0));
+ }
+
+ player->velocity = Vector3Scale(player->velocity, 5.0);
+
+ // Apply velocity
+ player->position = Vector3Add(
+ player->position, Vector3Scale(player->velocity, GetFrameTime()));
+
+ // Apply camera.
+ camera->position = player->position;
+ camera->target = Vector3Add(player->position, player->direction);
+}