Files
wschod/game/src/state.c
T
2025-06-07 13:59:15 +02:00

93 lines
2.7 KiB
C

#include "state.h"
extern vec3 camera_position;
extern vec3 camera_rotation;
extern Entity *player_entity, *sky_entity;
float delta_time;
int last_time;
void
game_state_init (int ticks)
{
last_time = ticks;
}
void
game_state_tick (int ticks)
{
/* Caluclate stuff per frame. */
delta_time = (ticks - last_time) / 1000.0;
last_time = ticks;
/* We pin the camera to the player position, with eye level 20
centimeters below the height. */
glm_vec3_copy (player_entity->position, camera_position);
camera_position[1] += player_entity->scale[1] - 0.2;
player_entity->rotation[1] = camera_rotation[1];
/* The sky needs to be in the center of the world all the time,
otherwise, as we explore the world, we might reach the end of the
sky. */
sky_entity->position[0] = camera_position[0];
sky_entity->position[2] = camera_position[2];
int speed = 5;
if (flags_get ("flight_enabled") && flags_get ("flying_fast"))
{
speed = 10;
}
if (flags_get ("moving_forward"))
{
vec3 dir, change, new_pos;
camera_get_direction (dir);
glm_vec3_scale (dir, delta_time * speed, change);
glm_vec3_add (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
if (flags_get ("moving_backward"))
{
vec3 dir, change, new_pos;
camera_get_direction (dir);
glm_vec3_scale (dir, delta_time * speed, change);
glm_vec3_sub (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
if (flags_get ("moving_right"))
{
vec3 right, change, new_pos;
camera_get_right (right);
glm_vec3_scale (right, delta_time * speed, change);
glm_vec3_add (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
if (flags_get ("moving_left"))
{
vec3 right, change, new_pos;
camera_get_right (right);
glm_vec3_scale (right, delta_time * speed, change);
glm_vec3_sub (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
if (flags_get ("flying_up") && flags_get ("flight_enabled"))
{
vec3 change, new_pos;
glm_vec3_scale (GLM_YUP, delta_time * speed, change);
glm_vec3_add (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
if (flags_get ("flying_down") && flags_get ("flight_enabled"))
{
vec3 change, new_pos;
glm_vec3_scale (GLM_YUP, delta_time * speed, change);
glm_vec3_sub (player_entity->position, change, new_pos);
glm_vec3_copy (new_pos, player_entity->position);
}
}