From df28b300a321d5cfb89e45aeaea7dab6b7d195c8 Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Mon, 16 Dec 2019 16:26:04 +0100 Subject: [PATCH] Inverting y axis --- .gitignore | 3 +- Makefile | 8 ++- include/components/gravity_component.h | 1 + include/systems/gravity_system.h | 12 +++++ include/systems/sfml_renderer_system.h | 1 + include/utility.h | 3 +- src/components/gravity_component.c | 4 +- src/engine/engine_component_builder.c | 2 + src/engine/engine_system_builder.c | 2 + src/systems/gravity_system.c | 11 ++-- src/systems/movable_system.c | 33 +++++++----- src/systems/sfml_renderer_system.c | 14 +++-- tests/game.gcprefab | 75 ++++++++++++++++++++++++++ tests/player.gcprefab | 13 +++++ 14 files changed, 155 insertions(+), 27 deletions(-) create mode 100644 include/systems/gravity_system.h create mode 100644 tests/game.gcprefab create mode 100644 tests/player.gcprefab diff --git a/.gitignore b/.gitignore index 1a01414..d48d625 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.o libgamacon.a -*.gc* \ No newline at end of file +*.gcda +*.gcno \ No newline at end of file diff --git a/Makefile b/Makefile index 8e41aa5..aad20ad 100644 --- a/Makefile +++ b/Makefile @@ -29,11 +29,16 @@ SRC = src/engine/engine.c \ src/systems/movable_system.c \ src/systems/parallax_system.c \ src/systems/controllable_system.c \ + src/systems/gravity_system.c \ src/engine/engine_system_builder.c \ src/engine/engine_component_builder.c OBJ = $(SRC:%.c=%.o) +GCDA = *.gcda + +GCNO = *.gcno + TESTS = tests/deserializations.c \ tests/game_loop.c @@ -65,7 +70,8 @@ tests_run: clean: $(RM) $(OBJ) - $(RM) *.gc* + $(RM) $(GCDA) + $(RM) $(GCNO) fclean: clean $(RM) $(NAME) diff --git a/include/components/gravity_component.h b/include/components/gravity_component.h index 96f2d42..932126a 100644 --- a/include/components/gravity_component.h +++ b/include/components/gravity_component.h @@ -13,6 +13,7 @@ struct gravity_component { gc_component base; int gravity_speed; + int max_speed; }; extern const struct gravity_component gravity_component; \ No newline at end of file diff --git a/include/systems/gravity_system.h b/include/systems/gravity_system.h new file mode 100644 index 0000000..78ef038 --- /dev/null +++ b/include/systems/gravity_system.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** texture_renderer_system +*/ + +#pragma once + +#include "system.h" + +extern const gc_system gravity_system; \ No newline at end of file diff --git a/include/systems/sfml_renderer_system.h b/include/systems/sfml_renderer_system.h index 2ecbb13..57ff2fa 100644 --- a/include/systems/sfml_renderer_system.h +++ b/include/systems/sfml_renderer_system.h @@ -15,6 +15,7 @@ struct sfml_renderer_system gc_system system; sfRenderWindow *window; sfSprite *sprite; + sfView *view; }; gc_system *gc_new_sfml_renderer(gc_engine *engine, \ diff --git a/include/utility.h b/include/utility.h index 9c5151e..055786b 100644 --- a/include/utility.h +++ b/include/utility.h @@ -20,4 +20,5 @@ float parse_arg_float(char **str); char *parse_arg_str(char **str); int my_pow(int nb, int p); -#define MIN(x, y) ((x) < (y) ? (x) : (y)) \ No newline at end of file +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#define MAX(x, y) ((x) > (y) ? (x) : (y)) \ No newline at end of file diff --git a/src/components/gravity_component.c b/src/components/gravity_component.c index 2ce67f2..bcb0eaf 100644 --- a/src/components/gravity_component.c +++ b/src/components/gravity_component.c @@ -16,13 +16,15 @@ static void gravity_ctr(void *component, va_list args) struct gravity_component *cmp = (struct gravity_component *)component; cmp->gravity_speed = va_arg(args, int); + cmp->max_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"); + cmp->gravity_speed = xml_getintprop(n, "speed"); + cmp->max_speed = xml_getintprop(n, "max_speed"); (void)engine; } diff --git a/src/engine/engine_component_builder.c b/src/engine/engine_component_builder.c index 5d2c428..7cc80dd 100644 --- a/src/engine/engine_component_builder.c +++ b/src/engine/engine_component_builder.c @@ -12,6 +12,7 @@ #include "components/renderer.h" #include "components/transform_component.h" #include "components/controllable_component.h" +#include "components/gravity_component.h" #include void engine_add_component(gc_engine *engine, const void *component) @@ -29,4 +30,5 @@ void engine_add_buildin_components(gc_engine *engine) engine->add_component(engine, &renderer_component); engine->add_component(engine, ¶llax_component); engine->add_component(engine, &controllable_component); + engine->add_component(engine, &gravity_component); } \ No newline at end of file diff --git a/src/engine/engine_system_builder.c b/src/engine/engine_system_builder.c index 84a632c..80ea91e 100644 --- a/src/engine/engine_system_builder.c +++ b/src/engine/engine_system_builder.c @@ -11,6 +11,7 @@ #include "systems/movable_system.h" #include "systems/controllable_system.h" #include "systems/parallax_system.h" +#include "systems/gravity_system.h" #include void engine_add_system(gc_engine *engine, const gc_system *system) @@ -26,6 +27,7 @@ void engine_add_buildin_systems(gc_engine *engine) engine->add_system(engine, ¶llax_system); engine->add_system(engine, new_system(&movable_system)); engine->add_system(engine, &controllable_system); + engine->add_system(engine, &gravity_system); } int engine_use_sfml(gc_engine *engine, const char *title, int framerate) diff --git a/src/systems/gravity_system.c b/src/systems/gravity_system.c index 3641e60..e8f88b4 100644 --- a/src/systems/gravity_system.c +++ b/src/systems/gravity_system.c @@ -10,23 +10,24 @@ #include "system.h" #include "texture.h" #include "vector2.h" +#include "utility.h" #include "components/movable_component.h" -#include "components/controllable_component.h" +#include "components/gravity_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 *)\ + struct gravity_component *grav = (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); + mov->speed_y = MAX(mov->speed_y - grav->gravity_speed, -grav->max_speed); (void)system; (void)dtime; + (void)engine; } void gravity_destroy(void *system) @@ -41,6 +42,6 @@ const gc_system gravity_system = { ctr: NULL, dtr: NULL, check_dependencies: &system_check_dependencies, - update_entity: &gravoty_update_entity, + update_entity: &gravity_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 8ae8a8e..0f1d349 100644 --- a/src/systems/movable_system.c +++ b/src/systems/movable_system.c @@ -16,20 +16,17 @@ #include "systems/movable_system.h" #include -void movable_update_entity(gc_engine *engine, void *system, \ -gc_entity *entity, float dtime) +void move_entity(gc_entity *entity, struct movable_component *mov, \ +quadtree *tree, float dtime) { - struct movable_component *mov = (struct movable_component *)\ -entity->get_component(entity, "MovableComponent"); struct transform_component *pos = (struct transform_component *)\ entity->get_component(entity, "TransformComponent"); - gc_movable_system *sys = (gc_movable_system *)system; - qt_object obj = (qt_object) { - id: entity->id, - rect: {pos->position.x, pos->position.y, pos->size.y, pos->size.x} + qt_object obj = (qt_object) {entity->id, + {pos->position.x, pos->position.y, pos->size.y, pos->size.x} }; - qt_collision i = collision_get_info(sys->tree, obj.id); + qt_collision i = collision_get_info(tree, obj.id); + printf("Speed: (%d, %d) Left: %d, Right: %d\n", mov->speed_x, mov->speed_y, i.distance_left, i.distance_right); if (mov->speed_x < 0) pos->position.x -= MIN(mov->speed_x * -dtime, i.distance_left); else @@ -39,16 +36,26 @@ entity->get_component(entity, "TransformComponent"); 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; - (void)system; + obj.rect.y = pos->position.y; + qt_update(tree, obj); +} + +void movable_update_entity(gc_engine *engine __attribute__((unused)), \ +void *system __attribute__((unused)), gc_entity *entity, float dtime) +{ + struct movable_component *mov = (struct movable_component *)\ +entity->get_component(entity, "MovableComponent"); + gc_movable_system *sys = (gc_movable_system *)system; + + // if (mov->speed_x != 0 || mov->speed_y != 0) AND IS ALREADY INSIDE THE TREE + move_entity(entity, mov, sys->tree, dtime); } void movable_ctr(void *system, va_list args) { gc_movable_system *mov = (gc_movable_system *)system; - mov->tree = qt_create((qt_intrect){0, 0, 1000, 1000}, 3); + mov->tree = qt_create((qt_intrect){-1000, -1000, 2000, 2000}, 25); (void)args; } diff --git a/src/systems/sfml_renderer_system.c b/src/systems/sfml_renderer_system.c index deeb8b9..d6836cc 100644 --- a/src/systems/sfml_renderer_system.c +++ b/src/systems/sfml_renderer_system.c @@ -17,7 +17,7 @@ void renderer_draw_texture(struct sfml_renderer_system *renderer, \ gc_sprite *sprite) { - sfVector2f pos = (sfVector2f){sprite->pos.x, sprite->pos.y}; + sfVector2f pos = (sfVector2f){sprite->pos.x, -sprite->pos.y}; sfVector2f scale; sfVector2u t; sfIntRect rect = { @@ -59,16 +59,19 @@ void sfmlrend_ctr(void *rend, va_list list) { struct sfml_renderer_system *renderer = (struct sfml_renderer_system *)rend; sfVideoMode mode = {800, 600, 32}; - sfWindowStyle style = sfDefaultStyle; gc_engine *engine = va_arg(list, gc_engine *); const char *title = va_arg(list, const char *); int framerate = va_arg(list, int); - renderer->window = sfRenderWindow_create(mode, title, style, NULL); + renderer->window = sfRenderWindow_create(mode, title, sfDefaultStyle, NULL); renderer->sprite = sfSprite_create(); - if (!renderer->window || !renderer->sprite) + renderer->view = sfView_create(); + if (!renderer->window || !renderer->sprite || !renderer->view) return; sfRenderWindow_setFramerateLimit(renderer->window, framerate); + sfView_setSize(renderer->view, (sfVector2f){800, 600}); + sfView_setCenter(renderer->view, (sfVector2f){400, -300}); + sfRenderWindow_setView(renderer->window, renderer->view); engine->is_open = &sfml_is_open; engine->has_focus = &sfml_has_focus; engine->is_keypressed = &sfml_is_keypressed; @@ -97,5 +100,6 @@ const struct sfml_renderer_system sfml_renderer = { destroy: &system_destroy }, window: NULL, - sprite: NULL + sprite: NULL, + view: NULL }; \ No newline at end of file diff --git a/tests/game.gcprefab b/tests/game.gcprefab new file mode 100644 index 0000000..1b2428f --- /dev/null +++ b/tests/game.gcprefab @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/player.gcprefab b/tests/player.gcprefab new file mode 100644 index 0000000..4af6e0d --- /dev/null +++ b/tests/player.gcprefab @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file