diff options
| author | Thomas Guillermo Albers Raviola <thomas@thomaslabs.org> | 2026-01-16 23:02:32 +0100 |
|---|---|---|
| committer | Thomas Guillermo Albers Raviola <thomas@thomaslabs.org> | 2026-01-16 23:02:32 +0100 |
| commit | 6b8af9cf83851c075c6c9514b1deaa931c2b19a4 (patch) | |
| tree | 428986b49c32e21d3f7a3c2dfa41858ae0153209 /07-july/src/player.c | |
Initial commit
Diffstat (limited to '07-july/src/player.c')
| -rw-r--r-- | 07-july/src/player.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/07-july/src/player.c b/07-july/src/player.c new file mode 100644 index 0000000..02a417b --- /dev/null +++ b/07-july/src/player.c @@ -0,0 +1,62 @@ +#include "player.h" +#include "util/util_time.h" +#include "input.h" +#include "util/util.h" + +#define MAX_MOVEMENT_SPEED 10 +#define MAX_ROTATION_SPEED 100 +#define GRAVITY -15 +#define JUMP_POWER 7 + +static void jump(player_t* player) +{ + player->verticalSpeed = JUMP_POWER; +} + +static void check_input(player_t* player) +{ + if(Input_isKeyPressed(SDL_SCANCODE_W)) { + player->speed = MAX_MOVEMENT_SPEED; + } else if(Input_isKeyPressed(SDL_SCANCODE_S)) { + player->speed = -MAX_MOVEMENT_SPEED; + } else { + player->speed = 0.0f; + } + + if(Input_isKeyPressed(SDL_SCANCODE_A)) { + player->turnSpeed = MAX_ROTATION_SPEED; + } else if(Input_isKeyPressed(SDL_SCANCODE_D)) { + player->turnSpeed = -MAX_ROTATION_SPEED; + } else { + player->turnSpeed = 0.0f; + } + + if(Input_isKeyPressed(SDL_SCANCODE_SPACE)) { + jump(player); + } +} + +void Player_Init(player_t* player) +{ + player->entity.position = vec3_create(0.0f, 6.0f, 0.0f); + player->entity.rotX = player->entity.rotY = player->entity.rotZ = 0; + player->speed = player->turnSpeed = player->verticalSpeed = 0; +} + +void Player_Update(player_t *player, terrain_t *terrain) +{ + check_input(player); + player->entity.rotY += player->turnSpeed * Time_GetFrameTime(); + player->entity.position.x += SDL_sinf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime(); + player->entity.position.z += SDL_cosf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime(); + + player->verticalSpeed += GRAVITY * Time_GetFrameTime(); + + player->entity.position.y += player->verticalSpeed * Time_GetFrameTime(); + + GLfloat terrainHeight = Terrain_GetHeightOfTerrain(terrain, player->entity.position.x, player->entity.position.z); + if(player->entity.position.y - 1.0f < terrainHeight) { + player->entity.position.y = terrainHeight + 1.0f; + player->verticalSpeed = 0.0f; + } +} |
