#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;
}
}