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)