commit 5fcdd7cc0c0b8f060b16cd16ec5accc41ee1e1d0
parent 9a64c28966c2c305f648820e89277e9c912fd8ef
Author: Amin Mesbah <dev@aminmesbah.com>
Date: Fri, 19 Apr 2019 12:28:45 -0700
Tune new movement code
It's surprising how much nicer this feels compared to simply adding a
velocity constant to position.
Diffstat:
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/src/game.c b/src/game.c
@@ -126,11 +126,12 @@ void game_update_and_render(struct GameMemory *game_memory, struct GameInput *ga
struct Entity *player = &game_state->player;
f32 dt = game_input->dt;
f32 max_meters_per_second = 5.0f;
- f32 acceleration_rate = 10.0f;
+ f32 acceleration_rate = 50.0f;
+ f32 friction = 0.7f;
if (game_input->key_up)
{
- player->acceleration.y = +acceleration_rate;
+ player->acceleration.y = acceleration_rate;
}
else if (game_input->key_down)
{
@@ -139,6 +140,7 @@ void game_update_and_render(struct GameMemory *game_memory, struct GameInput *ga
else
{
player->acceleration.y = 0.0f;
+ player->velocity.y = player->velocity.y * friction;
}
if (game_input->key_left)
@@ -147,21 +149,23 @@ void game_update_and_render(struct GameMemory *game_memory, struct GameInput *ga
}
else if (game_input->key_right)
{
- player->acceleration.x = +acceleration_rate;
+ player->acceleration.x = acceleration_rate;
}
else
{
player->acceleration.x = 0.0f;
+ player->velocity.x = player->velocity.x * friction;
}
- glmth_clamp(&player->velocity.x, -max_meters_per_second, max_meters_per_second);
-
// Semi implicit Euler integration: https://gafferongames.com/post/integration_basics/
player->velocity = glmth_v2_a(player->velocity, glmth_v2f_m(player->acceleration, dt));
- player->pos = glmth_v2_a(player->pos, glmth_v2f_m(player->velocity, dt));
+ glmth_clamp(&player->velocity.x, -max_meters_per_second, max_meters_per_second);
+ glmth_clamp(&player->velocity.y, -max_meters_per_second, max_meters_per_second);
+ player->pos = glmth_v2_a(player->pos, glmth_v2f_m(player->velocity, dt));
glmth_clamp(&(player->pos.x), 0, ROOM_TILE_DIM_X);
glmth_clamp(&(player->pos.y), 0, ROOM_TILE_DIM_Y);
+
printf("A: ");
glmth_v2_print(player->acceleration);
printf("V: ");