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);