From c4bfa06987bb730126c32151f6943d709797d120 Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Mon, 16 Dec 2019 14:47:05 +0100 Subject: [PATCH] Reworking a bit how movement is made --- Makefile | 1 + include/components/controllable_component.h | 1 + include/components/gravity_component.h | 18 +++++++ include/components/movable_component.h | 5 +- include/quadtree.h | 3 +- src/components/controllable_component.c | 3 ++ src/components/gravity_component.c | 56 +++++++++++++++++++++ src/components/movable_component.c | 13 +++-- src/components/renderer.c | 5 +- src/engine/engine.c | 4 ++ src/scene/scene.c | 13 ++++- src/systems/controllable_system.c | 5 +- src/systems/gravity_system.c | 46 +++++++++++++++++ src/systems/movable_system.c | 16 ++++-- tests/game_loop.c | 4 +- 15 files changed, 170 insertions(+), 23 deletions(-) create mode 100644 include/components/gravity_component.h create mode 100644 src/components/gravity_component.c create mode 100644 src/systems/gravity_system.c diff --git a/Makefile b/Makefile index 5373abf..8e41aa5 100644 --- a/Makefile +++ b/Makefile @@ -17,6 +17,7 @@ SRC = src/engine/engine.c \ src/components/renderer.c \ src/components/parallax_component.c \ src/components/controllable_component.c \ + src/components/gravity_component.c \ src/scene/scene.c \ src/utility/arraylen.c \ src/utility/list.c \ diff --git a/include/components/controllable_component.h b/include/components/controllable_component.h index 5bb8331..d3fc3de 100644 --- a/include/components/controllable_component.h +++ b/include/components/controllable_component.h @@ -15,6 +15,7 @@ struct controllable_component int left_key; int right_key; int jump_key; + int speed; }; extern const struct controllable_component controllable_component; \ No newline at end of file diff --git a/include/components/gravity_component.h b/include/components/gravity_component.h new file mode 100644 index 0000000..96f2d42 --- /dev/null +++ b/include/components/gravity_component.h @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** gravity_component +*/ + +#pragma once + +#include "component.h" + +struct gravity_component +{ + gc_component base; + int gravity_speed; +}; + +extern const struct gravity_component gravity_component; \ No newline at end of file diff --git a/include/components/movable_component.h b/include/components/movable_component.h index e8c09e0..974b649 100644 --- a/include/components/movable_component.h +++ b/include/components/movable_component.h @@ -13,9 +13,8 @@ struct movable_component { gc_component base; - bool moving_left; - bool moving_right; - int speed; + int speed_x; + int speed_y; }; extern const struct movable_component movable_component; \ No newline at end of file diff --git a/include/quadtree.h b/include/quadtree.h index 205572d..cd485fb 100644 --- a/include/quadtree.h +++ b/include/quadtree.h @@ -47,4 +47,5 @@ int qt_add(quadtree *tree, qt_object obj); qt_collision collision_get_info(quadtree *tree, int entity_id); bool qt_collide(qt_intrect r1, qt_intrect r2); qt_object *qt_getobj(quadtree *tree, int id); -int qt_update(quadtree *tree, qt_object obj); \ No newline at end of file +int qt_update(quadtree *tree, qt_object obj); +void qt_destroy(quadtree *tree); \ No newline at end of file diff --git a/src/components/controllable_component.c b/src/components/controllable_component.c index eed260f..e94f656 100644 --- a/src/components/controllable_component.c +++ b/src/components/controllable_component.c @@ -19,6 +19,7 @@ component; cmp->left_key = va_arg(args, int); cmp->right_key = va_arg(args, int); cmp->jump_key = va_arg(args, int); + cmp->speed = va_arg(args, int); } static void controllable_fdctr(gc_engine *engine, void *component, node *n) @@ -29,6 +30,7 @@ component; cmp->left_key = xml_getintprop(n, "left"); cmp->right_key = xml_getintprop(n, "right"); cmp->jump_key = xml_getintprop(n, "jump"); + cmp->speed = xml_getintprop(n, "speed"); (void)engine; } @@ -61,4 +63,5 @@ const struct controllable_component controllable_component = { left_key: 16, right_key: 3, jump_key: ' ', + speed: 700 }; \ No newline at end of file diff --git a/src/components/gravity_component.c b/src/components/gravity_component.c new file mode 100644 index 0000000..2ce67f2 --- /dev/null +++ b/src/components/gravity_component.c @@ -0,0 +1,56 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** gravity_component +*/ + +#include "xml.h" +#include "component.h" +#include "components/gravity_component.h" +#include "utility.h" +#include + +static void gravity_ctr(void *component, va_list args) +{ + struct gravity_component *cmp = (struct gravity_component *)component; + + cmp->gravity_speed = va_arg(args, int); +} + +static void gravity_fdctr(gc_engine *engine, void *component, node *n) +{ + struct gravity_component *cmp = (struct gravity_component *)component; + + cmp->gravity_speed = xml_getintprop(n, "gravity_speed"); + (void)engine; +} + +static void gravity_dtr(void *component) +{ + (void)component; +} + +static char *gravity_serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct gravity_component gravity_component = { + base: { + name: "GravityComponent", + size: sizeof(struct gravity_component), + dependencies: (char *[]){ + "MovableComponent", + "TransformComponent", + NULL + }, + ctr: &gravity_ctr, + fdctr: &gravity_fdctr, + dtr: &gravity_dtr, + serialize: &gravity_serialize, + destroy: &component_destroy + }, + gravity_speed: 10 +}; \ No newline at end of file diff --git a/src/components/movable_component.c b/src/components/movable_component.c index 9a6da74..df8b02c 100644 --- a/src/components/movable_component.c +++ b/src/components/movable_component.c @@ -15,16 +15,16 @@ static void movable_ctr(void *component, va_list args) { struct movable_component *cmp = (struct movable_component *)component; - cmp->speed = va_arg(args, int); + cmp->speed_x = va_arg(args, int); + cmp->speed_y = va_arg(args, int); } static void movable_fdctr(gc_engine *engine, void *component, node *n) { struct movable_component *cmp = (struct movable_component *)component; - cmp->speed = xml_getintprop(n, "speed"); - cmp->moving_left = false; - cmp->moving_right = false; + cmp->speed_x = xml_getintprop(n, "speedX"); + cmp->speed_y = xml_getintprop(n, "speedY"); (void)engine; } @@ -50,7 +50,6 @@ const struct movable_component movable_component = { serialize: &movable_serialize, destroy: &component_destroy }, - moving_left: false, - moving_right: false, - speed: 10 + speed_x: 0, + speed_y: 0 }; \ No newline at end of file diff --git a/src/components/renderer.c b/src/components/renderer.c index 9c484ff..f769804 100644 --- a/src/components/renderer.c +++ b/src/components/renderer.c @@ -36,7 +36,6 @@ static void rend_fdctr(gc_engine *engine, void *component, node *n) node *rect = xml_getnode(n, "Rect"); sfVector2u size; - cmp->sprite = malloc(sizeof(gc_sprite)); if (!cmp->sprite) return; cmp->sprite->texture = get_texture(engine, xml_getproperty(n, "src")); @@ -54,7 +53,9 @@ static void rend_fdctr(gc_engine *engine, void *component, node *n) static void rend_dtr(void *component) { - (void)component; + struct renderer *cmp = (struct renderer *)component; + + free(cmp->sprite); } static char *rend_serialize(void *component) diff --git a/src/engine/engine.c b/src/engine/engine.c index f051a8d..673189d 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -47,6 +47,10 @@ void engine_destroy(gc_engine *engine) ((gc_system *)system->data)->destroy(system->data); free(system); } + for (gc_list *cmp = engine->components; cmp; cmp = next) { + next = cmp->next; + free(cmp); + } free(engine); } diff --git a/src/scene/scene.c b/src/scene/scene.c index fe3d9d0..4975fef 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -39,13 +39,24 @@ int scene_load_textures(gc_scene *scene, const char **textures) void scene_destroy(gc_scene *scene) { gc_list *next = NULL; + gc_tupple *tup = scene->entities_by_cmp; for (gc_list *entity = scene->entities; entity; entity = next) { next = entity->next; ((gc_entity *)entity->data)->destroy(entity->data); + free(entity); } - for (int i = 0; scene->textures[i]; i++) { + for (int i = 0; scene->textures[i]; i++) scene->textures[i]->destroy(scene->textures[i]); + free(scene->textures); + for (gc_tupple *tupple = tup; tupple; tupple = tup) { + tup = tupple->next; + for (gc_list *li = tupple->entities; li; li = next) { + next = li->next; + free(li); + } + free(tupple->name); + free(tupple); } free(scene); } diff --git a/src/systems/controllable_system.c b/src/systems/controllable_system.c index dce4cb5..da61408 100644 --- a/src/systems/controllable_system.c +++ b/src/systems/controllable_system.c @@ -22,8 +22,9 @@ entity->get_component(entity, "ControllableComponent"); struct movable_component *mov = (struct movable_component *)\ entity->get_component(entity, "MovableComponent"); - mov->moving_left = engine->is_keypressed(con->left_key); - mov->moving_right = engine->is_keypressed(con->right_key); + mov->speed_x = 0; + mov->speed_x -= engine->is_keypressed(con->left_key) * con->speed; + mov->speed_x += engine->is_keypressed(con->right_key) * con->speed; (void)system; (void)dtime; } diff --git a/src/systems/gravity_system.c b/src/systems/gravity_system.c new file mode 100644 index 0000000..3641e60 --- /dev/null +++ b/src/systems/gravity_system.c @@ -0,0 +1,46 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** gravity_system +*/ + + +#include "entity.h" +#include "system.h" +#include "texture.h" +#include "vector2.h" +#include "components/movable_component.h" +#include "components/controllable_component.h" +#include "components/renderer.h" +#include + +void gravity_update_entity(gc_engine *engine, void *system, \ +gc_entity *entity, float dtime) +{ + struct gravity_component *con = (struct gravity_component *)\ +entity->get_component(entity, "GravityComponent"); + struct movable_component *mov = (struct movable_component *)\ +entity->get_component(entity, "MovableComponent"); + + mov->moving_left = engine->is_keypressed(con->left_key); + mov->moving_right = engine->is_keypressed(con->right_key); + (void)system; + (void)dtime; +} + +void gravity_destroy(void *system) +{ + (void)system; +} + +const gc_system gravity_system = { + name: "GravitySystem", + component_name: "GravityComponent", + size: sizeof(gc_system), + ctr: NULL, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &gravoty_update_entity, + destroy: &gravity_destroy +}; \ No newline at end of file diff --git a/src/systems/movable_system.c b/src/systems/movable_system.c index 6a3b8f8..8ae8a8e 100644 --- a/src/systems/movable_system.c +++ b/src/systems/movable_system.c @@ -30,10 +30,14 @@ entity->get_component(entity, "TransformComponent"); }; qt_collision i = collision_get_info(sys->tree, obj.id); - if (mov->moving_left) - pos->position.x -= MIN(mov->speed * dtime, i.distance_left); - if (mov->moving_right) - pos->position.x += MIN(mov->speed * dtime, i.distance_right); + if (mov->speed_x < 0) + pos->position.x -= MIN(mov->speed_x * -dtime, i.distance_left); + else + pos->position.x += MIN(mov->speed_x * dtime, i.distance_right); + if (mov->speed_y < 0) + pos->position.y -= MIN(mov->speed_y * -dtime, i.distance_down); + else + pos->position.y += MIN(mov->speed_y * dtime, i.distance_top); obj.rect.x = pos->position.x; qt_update(sys->tree, obj); (void)engine; @@ -50,7 +54,9 @@ void movable_ctr(void *system, va_list args) void movable_dtr(void *system) { - //SHOULD DESTROY THE QUADTREE HERE + gc_movable_system *mov = (gc_movable_system *)system; + + qt_destroy(mov->tree); (void)system; } diff --git a/tests/game_loop.c b/tests/game_loop.c index d5a7635..2210598 100644 --- a/tests/game_loop.c +++ b/tests/game_loop.c @@ -19,9 +19,9 @@ Test(getentities, filter) engine->change_scene(engine, scene); prefab_load(engine, "tests/game.gcprefab"); list = engine->scene->get_entity_by_cmp(engine->scene, "MovableComponent"); - while(list) { + while (list) { count++; - list = list->next; + list = list->next; } cr_assert_eq(count, 3); } \ No newline at end of file