From 6ed652e7321dabd1f24c33484722c77e8c98ffad Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Wed, 11 Dec 2019 19:22:41 +0100 Subject: [PATCH] Finishing to move the sfml and adding a movable component --- Makefile | 1 + include/components/movable_component.h | 1 + include/engine.h | 4 +++ include/prefab.h | 2 +- include/system.h | 2 +- include/systems/movable_system.h | 12 +++++++ include/systems/sfml_renderer_system.h | 2 ++ src/components/movable_component.c | 15 +++++---- src/deserializer/prefab.c | 14 ++++++--- src/engine/engine.c | 6 +++- src/engine/engine_internal.c | 14 ++++++--- src/engine/engine_system_builder.c | 2 ++ src/renderer/sfml_functions.c | 13 ++++++++ src/scene/scene.c | 8 +++++ src/scene/scene_creator.c | 8 ----- src/systems/movable_system.c | 43 ++++++++++++++++++++++++++ src/systems/parallax_system.c | 4 ++- src/systems/sfml_renderer_system.c | 6 +++- 18 files changed, 129 insertions(+), 28 deletions(-) create mode 100644 include/systems/movable_system.h delete mode 100644 src/scene/scene_creator.c create mode 100644 src/systems/movable_system.c diff --git a/Makefile b/Makefile index 5a72d7b..e432870 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,7 @@ SRC = src/engine/engine.c \ src/deserializer/prefab.c \ src/system.c \ src/systems/sfml_renderer_system.c \ + src/systems/movable_system.c \ src/systems/parallax_system.c \ src/engine/engine_system_builder.c \ src/engine/engine_component_builder.c diff --git a/include/components/movable_component.h b/include/components/movable_component.h index f651341..d8eb779 100644 --- a/include/components/movable_component.h +++ b/include/components/movable_component.h @@ -15,6 +15,7 @@ struct movable_component int left_key; int right_key; int jump_key; + int speed; }; extern const struct movable_component movable_component; \ No newline at end of file diff --git a/include/engine.h b/include/engine.h index b8b13d3..14e33b8 100644 --- a/include/engine.h +++ b/include/engine.h @@ -20,6 +20,8 @@ struct gc_engine { gc_scene *scene; bool (*is_open)(gc_engine *engine); + bool (*has_focus)(gc_engine *engine); + bool (*is_keypressed)(int key); void (*handle_events)(gc_engine *engine); int (*game_loop)(gc_engine *engine, float dtime); void (*draw)(gc_engine *engine); @@ -37,6 +39,8 @@ struct gc_engine gc_engine *engine_create(); bool engine_is_open(gc_engine *engine); +bool engine_has_focus(gc_engine *engine); +bool engine_is_keypressed(int key); void handle_events(gc_engine *engine); void engine_draw(gc_engine *engine); int change_scene(gc_engine *engine, gc_scene *scene); diff --git a/include/prefab.h b/include/prefab.h index 1681762..058f8d6 100644 --- a/include/prefab.h +++ b/include/prefab.h @@ -10,5 +10,5 @@ #include "entity.h" int prefab_load(gc_engine *engine, const char *path); - +int prefab_loadentities(node *n, gc_engine *engine); gc_entity *deserialize_entity(gc_engine *engine, node *n); \ No newline at end of file diff --git a/include/system.h b/include/system.h index fd93c85..bbf4973 100644 --- a/include/system.h +++ b/include/system.h @@ -17,7 +17,7 @@ struct gc_system const char *name; const char *component_name; bool (*check_dependencies)(const gc_system *, const gc_entity *); - void (*update_entity)(void *system, gc_entity *entity, float dtime); + void (*update_entity)(gc_engine *, void *system, gc_entity *, float dtime); void (*destroy)(void *system); }; diff --git a/include/systems/movable_system.h b/include/systems/movable_system.h new file mode 100644 index 0000000..19a6ff8 --- /dev/null +++ b/include/systems/movable_system.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** movable_system +*/ + +#pragma once + +#include "system.h" + +extern const gc_system movable_system; \ No newline at end of file diff --git a/include/systems/sfml_renderer_system.h b/include/systems/sfml_renderer_system.h index 496c402..f2b35e5 100644 --- a/include/systems/sfml_renderer_system.h +++ b/include/systems/sfml_renderer_system.h @@ -21,5 +21,7 @@ struct sfml_renderer_system gc_system *gc_new_sfml_renderer(gc_engine *engine, \ const char *title, int framerate); bool sfml_is_open(gc_engine *engine); +bool sfml_has_focus(gc_engine *engine); +bool sfml_is_keypressed(int key); void sfml_handle_events(gc_engine *engine); void sfml_draw(gc_engine *engine); \ No newline at end of file diff --git a/src/components/movable_component.c b/src/components/movable_component.c index b4e74ed..b4e5f60 100644 --- a/src/components/movable_component.c +++ b/src/components/movable_component.c @@ -18,15 +18,17 @@ static void movable_ctr(void *component, va_list args) 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 movable_fdctr(gc_engine *engine, void *component, node *n) { struct movable_component *cmp = (struct movable_component *)component; - cmp->left_key = xml_getproperty(n, "left")[0]; - cmp->right_key = xml_getproperty(n, "right")[0]; - cmp->jump_key = xml_getproperty(n, "jump")[0]; + 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; } @@ -45,14 +47,15 @@ const struct movable_component movable_component = { base: { name: "MovableComponent", size: sizeof(struct movable_component), - dependencies: (char *[]){NULL}, + dependencies: (char *[]){"TransformComponent", NULL}, ctr: &movable_ctr, fdctr: &movable_fdctr, dtr: &movable_dtr, serialize: &movable_serialize, destroy: &component_destroy }, - left_key: 'Q', + left_key: 16, right_key: 'D', - jump_key: ' ' + jump_key: ' ', + speed: 10 }; \ No newline at end of file diff --git a/src/deserializer/prefab.c b/src/deserializer/prefab.c index 66d711b..c536139 100644 --- a/src/deserializer/prefab.c +++ b/src/deserializer/prefab.c @@ -17,13 +17,20 @@ int prefab_load(gc_engine *engine, const char *path) { node *n; - gc_entity *entity; if (!engine || !engine->scene) return (-1); n = xml_parse(path); - if (!n) + if (!n || prefab_loadentities(n, engine) < 0) return (-1); + xml_destroy(n); + return (0); +} + +int prefab_loadentities(node *n, gc_engine *engine) +{ + gc_entity *entity; + n = xml_getnode(n, "gc_entities"); if (!n) return (-1); @@ -33,6 +40,5 @@ int prefab_load(gc_engine *engine, const char *path) return (-1); engine->scene->add_entity(engine->scene, entity); } - xml_destroy(n); return (0); -} +} \ No newline at end of file diff --git a/src/engine/engine.c b/src/engine/engine.c index 1e0e960..5b92a2b 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -21,12 +21,14 @@ void update_system(gc_engine *engine, gc_system *sys, float dtime) entities = scene->get_entity_by_cmp(scene, sys->component_name); for (gc_list *entity = entities; entity; entity = entity->next) { if (sys->check_dependencies(sys, entity->data)) - sys->update_entity(sys, entity->data, dtime); + sys->update_entity(engine, sys, entity->data, dtime); } } int game_loop(gc_engine *engine, float dtime) { + if (!engine->has_focus(engine)) + return (0); engine->handle_events(engine); for (gc_list *sys = engine->systems; sys; sys = sys->next) update_system(engine, sys->data, dtime); @@ -56,6 +58,8 @@ gc_engine *engine_create() return (NULL); engine->scene = NULL; engine->is_open = &engine_is_open; + engine->has_focus = &engine_has_focus; + engine->is_keypressed = &engine_is_keypressed; engine->handle_events = &handle_events; engine->game_loop = &game_loop; engine->draw = &engine_draw; diff --git a/src/engine/engine_internal.c b/src/engine/engine_internal.c index d3dbd60..fbe0732 100644 --- a/src/engine/engine_internal.c +++ b/src/engine/engine_internal.c @@ -14,6 +14,12 @@ bool engine_is_open(gc_engine *engine) return (false); } +bool engine_has_focus(gc_engine *engine) +{ + (void)engine; + return (true); +} + void handle_events(gc_engine *engine) { (void)engine; @@ -24,10 +30,8 @@ void engine_draw(gc_engine *engine) (void)engine; } -int change_scene(gc_engine *engine, gc_scene *scene) +bool engine_is_keypressed(int key) { - if (engine->scene) - engine->scene->destroy(engine->scene); - engine->scene = scene; - return (0); + (void)key; + return (false); } \ No newline at end of file diff --git a/src/engine/engine_system_builder.c b/src/engine/engine_system_builder.c index 80221ff..1338629 100644 --- a/src/engine/engine_system_builder.c +++ b/src/engine/engine_system_builder.c @@ -8,6 +8,7 @@ #include "engine.h" #include "system.h" #include "systems/sfml_renderer_system.h" +#include "systems/movable_system.h" #include "systems/parallax_system.h" #include @@ -22,6 +23,7 @@ void engine_add_buildin_systems(gc_engine *engine) engine->add_system = &engine_add_system; engine->get_system = &engine_get_system; engine->add_system(engine, ¶llax_system); + engine->add_system(engine, &movable_system); } int engine_use_sfml(gc_engine *engine, const char *title, int framerate) diff --git a/src/renderer/sfml_functions.c b/src/renderer/sfml_functions.c index 740c4a4..39c145c 100644 --- a/src/renderer/sfml_functions.c +++ b/src/renderer/sfml_functions.c @@ -17,6 +17,19 @@ engine->get_system(engine, "SfmlRendererSystem"); return (sfRenderWindow_isOpen(renderer->window)); } +bool sfml_has_focus(gc_engine *engine) +{ + sfml_renderer_system *renderer = (sfml_renderer_system *)\ +engine->get_system(engine, "SfmlRendererSystem"); + + return (sfRenderWindow_hasFocus(renderer->window)); +} + +bool sfml_is_keypressed(int key) +{ + return (sfKeyboard_isKeyPressed(key)); +} + void sfml_handle_events(gc_engine *engine) { sfml_renderer_system *renderer = (sfml_renderer_system *)\ diff --git a/src/scene/scene.c b/src/scene/scene.c index 1fff3dc..fe3d9d0 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -66,4 +66,12 @@ gc_scene *scene_create(const char **textures) scene->get_entity_by_cmp = &get_entity_by_cmp; scene->destroy = &scene_destroy; return (scene); +} + +int change_scene(gc_engine *engine, gc_scene *scene) +{ + if (engine->scene) + engine->scene->destroy(engine->scene); + engine->scene = scene; + return (0); } \ No newline at end of file diff --git a/src/scene/scene_creator.c b/src/scene/scene_creator.c deleted file mode 100644 index c5b8b4b..0000000 --- a/src/scene/scene_creator.c +++ /dev/null @@ -1,8 +0,0 @@ -/* -** EPITECH PROJECT, 2019 -** MUL_my_runner_2019 -** File description: -** scene_creator -*/ - -int scene_create_fromxml() \ No newline at end of file diff --git a/src/systems/movable_system.c b/src/systems/movable_system.c new file mode 100644 index 0000000..2b9cfef --- /dev/null +++ b/src/systems/movable_system.c @@ -0,0 +1,43 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** movable_system +*/ + +#include "entity.h" +#include "system.h" +#include "texture.h" +#include "vector2.h" +#include "components/movable_component.h" +#include "components/transform_component.h" +#include "components/renderer.h" +#include + +void movable_update_entity(gc_engine *engine, void *system,\ +gc_entity *entity, 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"); + + if (engine->is_keypressed(mov->left_key)) + pos->position.x -= mov->speed * dtime; + if (engine->is_keypressed(mov->right_key)) + pos->position.x += mov->speed * dtime; + (void)system; +} + +void movable_destroy(void *system) +{ + (void)system; +} + +const gc_system movable_system = { + name: "MovableSystem", + component_name: "MovableComponent", + check_dependencies: &system_check_dependencies, + update_entity: &movable_update_entity, + destroy: &movable_destroy +}; \ No newline at end of file diff --git a/src/systems/parallax_system.c b/src/systems/parallax_system.c index 3ba17ad..6aa302f 100644 --- a/src/systems/parallax_system.c +++ b/src/systems/parallax_system.c @@ -13,7 +13,8 @@ #include "components/renderer.h" #include -void parallax_update_entity(void *system, gc_entity *entity, float dtime) +void parallax_update_entity(gc_engine *engine, void *system, \ +gc_entity *entity, float dtime) { struct renderer *text = \ (struct renderer *)entity->get_component(entity, "Renderer"); @@ -24,6 +25,7 @@ void parallax_update_entity(void *system, gc_entity *entity, float dtime) return; text->sprite->rect.left += parallax->speed * dtime; (void)system; + (void)engine; } void parallax_destroy(void *system) diff --git a/src/systems/sfml_renderer_system.c b/src/systems/sfml_renderer_system.c index f1929e2..73766ba 100644 --- a/src/systems/sfml_renderer_system.c +++ b/src/systems/sfml_renderer_system.c @@ -35,7 +35,8 @@ void renderer_draw_texture(sfml_renderer_system *renderer, gc_sprite *sprite) sfRenderWindow_drawSprite(renderer->window, renderer->sprite, NULL); } -void sfml_update_entity(void *system, gc_entity *entity, float dtime) +void sfml_update_entity(gc_engine *engine, void *system,\ +gc_entity *entity, float dtime) { struct transform_component *pos = (struct transform_component *)\ entity->get_component(entity, "TransformComponent"); @@ -49,6 +50,7 @@ entity->get_component(entity, "Renderer"); if (text->type == GC_TEXTUREREND) renderer_draw_texture((sfml_renderer_system *)system, text->sprite); (void)dtime; + (void)engine; } void sfml_destroy(void *system) @@ -87,6 +89,8 @@ const char *title, int framerate) return (NULL); sfRenderWindow_setFramerateLimit(renderer->window, framerate); engine->is_open = &sfml_is_open; + engine->has_focus = &sfml_has_focus; + engine->is_keypressed = &sfml_is_keypressed; engine->handle_events = &sfml_handle_events; engine->draw = &sfml_draw; return ((gc_system *)renderer);