a-game

2D platformer written from scratch.
Log | Files | Refs | README | LICENSE

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:
Msrc/game.c | 16++++++++++------
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: ");