From b97d8ada855d8a396fad2e0737165333a5e2c191 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Wed, 29 Apr 2020 22:44:02 +0200 Subject: [PATCH] Smoothing player movements --- include/components/controllable_component.h | 1 - lib/gamacon | 2 +- src/components/controllable_component.c | 2 -- src/systems/map_movement_system.c | 38 +++++++++++++-------- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/include/components/controllable_component.h b/include/components/controllable_component.h index 99993dc..e4f2fb7 100644 --- a/include/components/controllable_component.h +++ b/include/components/controllable_component.h @@ -15,7 +15,6 @@ struct controllable_component gc_component base; int movement_x; int movement_y; - float move_callback; bool can_move; }; diff --git a/lib/gamacon b/lib/gamacon index d1a8a90..8d091a9 160000 --- a/lib/gamacon +++ b/lib/gamacon @@ -1 +1 @@ -Subproject commit d1a8a904a4fe490745de6e2fd543cff1b9da1bc8 +Subproject commit 8d091a9575414e2b4e081ad3aa2aa5dc4b53b93c diff --git a/src/components/controllable_component.c b/src/components/controllable_component.c index 3f2856d..69c15f1 100644 --- a/src/components/controllable_component.c +++ b/src/components/controllable_component.c @@ -18,7 +18,6 @@ component; cmp->movement_x = 0; cmp->movement_y = 0; - cmp->move_callback = 0; cmp->can_move = true; (void)args; } @@ -31,7 +30,6 @@ component; cmp->movement_x = 0; cmp->movement_y = 0; - cmp->move_callback = 0; (void)scene; (void)entity; (void)n; diff --git a/src/systems/map_movement_system.c b/src/systems/map_movement_system.c index 647e6aa..898a71f 100644 --- a/src/systems/map_movement_system.c +++ b/src/systems/map_movement_system.c @@ -14,22 +14,33 @@ #include #include #include +#include static gc_vector2i get_new_map_pos(struct map_linker *link, \ struct controllable_component *ctl) { if (!link->tile) return ((gc_vector2i){0, 0}); - gc_vector2i pos = (gc_vector2i) { - link->tile->corners[0]->x, - link->tile->corners[0]->y - }; - gc_vector2i move = (gc_vector2i){ - round(cos(-45) * -ctl->movement_x - sin(-45) * ctl->movement_y), - round(sin(-45) * -ctl->movement_x + cos(-45) * ctl->movement_y), - }; + gc_vector2i moves = (gc_vector2i){0, 0}; - return (gc_vector2i_add(pos, move)); + link->offset = gc_vector2i_add(link->offset, (gc_vector2i){ + round(cos(-45) * -ctl->movement_x - sin(-45) * -ctl->movement_y), + round(sin(-45) * -ctl->movement_x + cos(-45) * -ctl->movement_y) + }); + moves.x = (link->offset.x / 9) % 9; + moves.y = -(link->offset.y / 9) % 9; +// if (moves.x != 0 || moves.y != 0) +// printf("Moves: %d, %d, Offsets: %d, %d\n", moves[0], moves[1], link->offset.x, link->offset.y); + if (link->offset.x > 8) + link->offset.x = -8; + if (link->offset.x < -8) + link->offset.x = 8; + if (link->offset.y > 8) + link->offset.y = -8; + if (link->offset.y < -8) + link->offset.y = 8; + return (gc_vector2i_add((gc_vector2i){ + link->tile->corners[0]->x, link->tile->corners[0]->y}, (gc_vector2i){moves.y, -moves.x})); } void set_animation(gc_entity *entity, struct controllable_component *ctl) @@ -62,25 +73,22 @@ float dtime) { struct controllable_component *ctl = GETCMP(entity, controllable_component); struct map_linker *link = GETCMP(entity, map_linker); + gc_vector2i map_pos = get_new_map_pos(link, ctl); gc_scene *scene = engine->scene; gc_list *maps = scene->get_entity_by_cmp(scene, "vertex_component"); struct vertex_component *map; - gc_vector2i map_pos = get_new_map_pos(link, ctl); struct tile *new_tile; if (!maps || !ctl->can_move) return; + set_animation(entity, ctl); map = GETCMP(maps->data, vertex_component); new_tile = get_tile_at(map, map_pos); - set_animation(entity, ctl); - if (new_tile && !new_tile->solid && ctl->move_callback <= 0 \ -&& new_tile != link->tile) { + if (new_tile && !new_tile->solid && new_tile != link->tile) { //CHECK FOR OVERFLOW link->tile->entity = NULL; new_tile->entity = entity; engine->trigger_event(engine, "entity_moved", entity, link->tile); - ctl->move_callback = .2f; } - ctl->move_callback -= dtime; } static void ctr(void *system, va_list list)