diff --git a/Makefile b/Makefile index ed99e9b..6dd2f19 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ SRC = src/engine/engine.c \ src/engine/engine_internal.c \ src/renderer/sfml_functions.c \ + src/renderer/update_to_cam.c \ src/renderer/texture_utility.c \ src/entity/entity.c \ src/entity/entity_factory.c \ @@ -16,6 +17,8 @@ SRC = src/engine/engine.c \ src/components/collision_component.c \ src/components/transform_component.c \ src/components/renderer.c \ + src/components/camera_follow.c \ + src/components/fixed_to_cam.c \ src/components/parallax_component.c \ src/components/controllable_component.c \ src/components/friction_component.c \ @@ -30,6 +33,7 @@ SRC = src/engine/engine.c \ src/system.c \ src/systems/sfml_renderer_system.c \ src/systems/movable_system.c \ + src/systems/camera_follow_system.c \ src/systems/collision_system.c \ src/systems/parallax_system.c \ src/systems/controllers/keyboard_controller_system.c \ diff --git a/include/components/camerafollow_component.h b/include/components/camerafollow_component.h new file mode 100644 index 0000000..11d50a9 --- /dev/null +++ b/include/components/camerafollow_component.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#pragma once + +#include "component.h" + +extern const gc_component camerafollow_component; \ No newline at end of file diff --git a/include/components/fixed_to_cam_component.h b/include/components/fixed_to_cam_component.h new file mode 100644 index 0000000..5440082 --- /dev/null +++ b/include/components/fixed_to_cam_component.h @@ -0,0 +1,12 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#pragma once + +#include "component.h" + +extern const gc_component fixed_to_cam; \ No newline at end of file diff --git a/include/engine.h b/include/engine.h index 2f33860..cca0602 100644 --- a/include/engine.h +++ b/include/engine.h @@ -29,8 +29,8 @@ struct gc_engine void (*destroy)(gc_engine *engine); gc_list *systems; - void (*add_system)(gc_engine *engine, const gc_system *system); - const gc_system *(*get_system)(gc_engine *engine, const char *name); + void (*add_system)(gc_engine *engine, const void *system); + void *(*get_system)(gc_engine *engine, const char *name); void (*finish_physics)(gc_engine *engine); gc_list *components; @@ -47,11 +47,13 @@ void engine_draw(gc_engine *engine); int change_scene(gc_engine *engine, gc_scene *scene); void engine_add_buildin_systems(gc_engine *engine); -const gc_system *engine_get_system(gc_engine *engine, const char *name); -void engine_add_system(gc_engine *engine, const gc_system *system); +void *engine_get_system(gc_engine *engine, const char *name); +void engine_add_system(gc_engine *engine, const void *system); void engine_add_buildin_components(gc_engine *engine); const void *engine_get_component(gc_engine *engine, const char *name); void engine_add_component(gc_engine *engine, const void *component); -int engine_use_sfml(gc_engine *engine, const char *title, int framerate); \ No newline at end of file +int engine_use_sfml(gc_engine *engine, const char *title, int framerate); + +#define GETSYS(x) ((struct x *)engine->get_system(engine, #x)) \ No newline at end of file diff --git a/include/systems/camerafollow_system.h b/include/systems/camerafollow_system.h new file mode 100644 index 0000000..d6246ef --- /dev/null +++ b/include/systems/camerafollow_system.h @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2019 +** Gamacon +** File description: +** movable_component +*/ + +#pragma once + +#include "component.h" + +struct camerafollow_system +{ + gc_system base; + gc_vector2 cam_pos; +}; + +extern const struct camerafollow_system camerafollow_system; \ No newline at end of file diff --git a/include/systems/sfml_renderer_system.h b/include/systems/sfml_renderer_system.h index 57ff2fa..6bb1ad2 100644 --- a/include/systems/sfml_renderer_system.h +++ b/include/systems/sfml_renderer_system.h @@ -9,6 +9,9 @@ #include "system.h" #include +#include "scene.h" +#include "systems/sfml_renderer_system.h" +#include "systems/camerafollow_system.h" struct sfml_renderer_system { @@ -25,5 +28,7 @@ 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); +void entities_update_to_cam(gc_scene *scene, \ +struct sfml_renderer_system *renderer, struct camerafollow_system *cam); extern const struct sfml_renderer_system sfml_renderer; \ No newline at end of file diff --git a/src/components/camera_follow.c b/src/components/camera_follow.c new file mode 100644 index 0000000..2e58aea --- /dev/null +++ b/src/components/camera_follow.c @@ -0,0 +1,52 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** camera_follow +*/ + +#include "xml.h" +#include "component.h" +#include "components/controllable_component.h" +#include "components/camerafollow_component.h" +#include "utility.h" +#include + +static void ctr(void *component, va_list args) +{ + (void)component; + (void)args; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + (void)scene; + (void)entity; + (void)component; + (void)n; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const gc_component camerafollow_component = { + name: "camerafollow_component", + size: sizeof(struct gc_component), + dependencies: (char *[]){ + "transform_component", + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy +}; \ No newline at end of file diff --git a/src/components/fixed_to_cam.c b/src/components/fixed_to_cam.c new file mode 100644 index 0000000..d7ca2ae --- /dev/null +++ b/src/components/fixed_to_cam.c @@ -0,0 +1,33 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** camera_follow +*/ + +#include "xml.h" +#include "component.h" +#include "components/controllable_component.h" +#include "components/camerafollow_component.h" +#include "utility.h" +#include + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const gc_component fixed_to_cam = { + name: "fixed_to_cam", + size: sizeof(struct gc_component), + dependencies: (char *[]){ + "transform_component", + NULL + }, + ctr: NULL, + fdctr: NULL, + dtr: NULL, + serialize: &serialize, + destroy: &component_destroy +}; \ No newline at end of file diff --git a/src/deserializer/deserialize_entity.c b/src/deserializer/deserialize_entity.c index 4cbec12..d4ce4d0 100644 --- a/src/deserializer/deserialize_entity.c +++ b/src/deserializer/deserialize_entity.c @@ -23,7 +23,8 @@ gc_scene *scene, node *n) return (NULL); } cmp = new_component(model, 0, 0, 0, 0, 0, 0, 0); - cmp->fdctr(entity, scene, cmp, n); + if (cmp->fdctr) + cmp->fdctr(entity, scene, cmp, n); return (cmp); } diff --git a/src/engine/engine_component_builder.c b/src/engine/engine_component_builder.c index 7561799..bc83c39 100644 --- a/src/engine/engine_component_builder.c +++ b/src/engine/engine_component_builder.c @@ -9,7 +9,9 @@ #include "system.h" #include "components/movable_component.h" #include "components/parallax_component.h" +#include "components/fixed_to_cam_component.h" #include "components/renderer.h" +#include "components/camerafollow_component.h" #include "components/transform_component.h" #include "components/controllable_component.h" #include "components/controllers/keyboard_controller.h" @@ -31,6 +33,8 @@ void engine_add_buildin_components(gc_engine *engine) engine->add_component(engine, &transform_component); engine->add_component(engine, &movable_component); engine->add_component(engine, &renderer_component); + engine->add_component(engine, &camerafollow_component); + engine->add_component(engine, &fixed_to_cam); engine->add_component(engine, ¶llax_component); engine->add_component(engine, &controllable_component); engine->add_component(engine, &keyboard_controller); diff --git a/src/engine/engine_system_builder.c b/src/engine/engine_system_builder.c index e6f62fc..df82d2e 100644 --- a/src/engine/engine_system_builder.c +++ b/src/engine/engine_system_builder.c @@ -13,9 +13,10 @@ #include "systems/controllers/keyboard_controller_system.h" #include "systems/friction_system.h" #include "systems/collision_system.h" +#include "systems/camerafollow_system.h" #include -void engine_add_system(gc_engine *engine, const gc_system *system) +void engine_add_system(gc_engine *engine, const void *system) { engine->systems = list_add(engine->systems, (void *)system); } @@ -39,10 +40,12 @@ void engine_add_buildin_systems(gc_engine *engine) int engine_use_sfml(gc_engine *engine, const char *title, int framerate) { - gc_system *renderer = new_system(&sfml_renderer, engine, title, framerate); + void *renderer = new_system(&sfml_renderer, engine, title, framerate); + void *camfollow = new_system(&camerafollow_system); - if (!renderer) + if (!renderer || !camfollow) return (-1); engine->add_system(engine, renderer); + engine->add_system(engine, camfollow); return (0); } \ No newline at end of file diff --git a/src/renderer/sfml_functions.c b/src/renderer/sfml_functions.c index a676aee..4aad941 100644 --- a/src/renderer/sfml_functions.c +++ b/src/renderer/sfml_functions.c @@ -8,19 +8,19 @@ #include "engine.h" #include #include "systems/sfml_renderer_system.h" +#include "systems/camerafollow_system.h" +#include "components/transform_component.h" bool sfml_is_open(gc_engine *engine) { - struct sfml_renderer_system *renderer = (struct sfml_renderer_system *)\ -engine->get_system(engine, "SfmlrendererSystem"); + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); return (sfRenderWindow_isOpen(renderer->window)); } bool sfml_has_focus(gc_engine *engine) { - struct sfml_renderer_system *renderer = (struct sfml_renderer_system *)\ -engine->get_system(engine, "SfmlrendererSystem"); + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); return (sfRenderWindow_hasFocus(renderer->window)); } @@ -32,8 +32,7 @@ bool sfml_is_keypressed(int key) void sfml_handle_events(gc_engine *engine) { - struct sfml_renderer_system *renderer = (struct sfml_renderer_system *)\ -engine->get_system(engine, "SfmlrendererSystem"); + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); sfEvent event; while (sfRenderWindow_pollEvent(renderer->window, &event)) { @@ -44,9 +43,17 @@ engine->get_system(engine, "SfmlrendererSystem"); void sfml_draw(gc_engine *engine) { - struct sfml_renderer_system *renderer = (struct sfml_renderer_system *)\ -engine->get_system(engine, "SfmlrendererSystem"); + struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); + struct camerafollow_system *cam = GETSYS(camerafollow_system); + if (cam) { + sfView_setCenter(renderer->view, (sfVector2f){ + cam->cam_pos.x, + -cam->cam_pos.y + }); + sfRenderWindow_setView(renderer->window, renderer->view); + entities_update_to_cam(engine->scene, renderer, cam); + } sfRenderWindow_display(renderer->window); sfRenderWindow_clear(renderer->window, sfBlack); } \ No newline at end of file diff --git a/src/renderer/update_to_cam.c b/src/renderer/update_to_cam.c new file mode 100644 index 0000000..70d2377 --- /dev/null +++ b/src/renderer/update_to_cam.c @@ -0,0 +1,31 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** update_to_cam +*/ + +#include "entity.h" +#include "scene.h" +#include "systems/camerafollow_system.h" +#include "components/transform_component.h" +#include "systems/sfml_renderer_system.h" +#include + +void entities_update_to_cam(gc_scene *scene, \ +struct sfml_renderer_system *renderer, struct camerafollow_system *cam) +{ + gc_list *list; + gc_entity *entity; + sfVector2f size; + + list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); + for (gc_list *li = list; li; li = li->next) { + entity = (gc_entity *)li->data; + size = sfView_getSize(renderer->view); + GETCMP(transform_component)->position = (gc_vector2) { + cam->cam_pos.x - size.x / 2, + cam->cam_pos.y + size.y / 2, + }; + } +} \ No newline at end of file diff --git a/src/system.c b/src/system.c index 0c49472..ca938fc 100644 --- a/src/system.c +++ b/src/system.c @@ -25,7 +25,7 @@ bool system_check_dependencies(const gc_system *sys, const gc_entity *entity) return (true); } -const gc_system *engine_get_system(gc_engine *engine, const char *name) +void *engine_get_system(gc_engine *engine, const char *name) { for (gc_list *sys = engine->systems; sys; sys = sys->next) { if (!my_strcmp(((const gc_system *)sys->data)->name, name)) diff --git a/src/systems/camera_follow_system.c b/src/systems/camera_follow_system.c new file mode 100644 index 0000000..a73a505 --- /dev/null +++ b/src/systems/camera_follow_system.c @@ -0,0 +1,56 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** friction +*/ + +#include "entity.h" +#include "system.h" +#include "texture.h" +#include "vector2.h" +#include "utility.h" +#include "components/transform_component.h" +#include "components/camerafollow_component.h" +#include "systems/camerafollow_system.h" +#include "math.h" +#include + +static void update_entity(gc_engine *engine, void *system, \ +gc_entity *entity, float dtime) +{ + struct camerafollow_system *sys = (struct camerafollow_system *)system; + struct transform_component *tra = GETCMP(transform_component); + + sys->cam_pos.x = (sys->cam_pos.x + tra->position.x) / 2; + sys->cam_pos.y = (sys->cam_pos.y + tra->position.y) / 2; + (void)engine; + (void)dtime; +} + +static void ctr(void *system, va_list args) +{ + struct camerafollow_system *sys = (struct camerafollow_system *)system; + + sys->cam_pos = (gc_vector2){0, 0}; + (void)args; +} + +static void destroy(void *system) +{ + (void)system; +} + +const struct camerafollow_system camerafollow_system = { + base: { + name: "camerafollow_system", + component_name: "camerafollow_component", + size: sizeof(struct camerafollow_system), + ctr: &ctr, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &update_entity, + destroy: &destroy + }, + cam_pos: (gc_vector2){0, 0} +}; \ No newline at end of file diff --git a/src/systems/collision_system.c b/src/systems/collision_system.c index 7e4d7ed..532fbb5 100644 --- a/src/systems/collision_system.c +++ b/src/systems/collision_system.c @@ -74,7 +74,7 @@ static void dtr(void *system) const gc_collision_system collision_system = { base: { - name: "CollisionSystem", + name: "collision_system", component_name: "collision_component", size: sizeof(gc_collision_system), ctr: &ctr, diff --git a/src/systems/controllers/keyboard_controller_system.c b/src/systems/controllers/keyboard_controller_system.c index 06333ec..f8d7258 100644 --- a/src/systems/controllers/keyboard_controller_system.c +++ b/src/systems/controllers/keyboard_controller_system.c @@ -34,7 +34,7 @@ void keyboard_destroy(void *system) } const gc_system keyboard_controller_system = { - name: "KeyboardSystem", + name: "keyboard_controller_system", component_name: "keyboard_controller", size: sizeof(gc_system), ctr: NULL, diff --git a/src/systems/friction_system.c b/src/systems/friction_system.c index 35ae908..6ecca6f 100644 --- a/src/systems/friction_system.c +++ b/src/systems/friction_system.c @@ -36,7 +36,7 @@ void fric_destroy(void *system) } const gc_system friction_system = { - name: "FrictionSystem", + name: "friction_system", component_name: "friction_component", size: sizeof(gc_system), ctr: NULL, diff --git a/src/systems/movable_system.c b/src/systems/movable_system.c index 246f7ed..9f54f83 100644 --- a/src/systems/movable_system.c +++ b/src/systems/movable_system.c @@ -63,7 +63,7 @@ static void dtr(void *system) } const gc_system movable_system = { - name: "MovableSystem", + name: "movable_system", component_name: "movable_component", size: sizeof(gc_system), ctr: &ctr, diff --git a/src/systems/parallax_system.c b/src/systems/parallax_system.c index e2d7e51..3ab37ab 100644 --- a/src/systems/parallax_system.c +++ b/src/systems/parallax_system.c @@ -32,7 +32,7 @@ void parallax_destroy(void *system) } const gc_system parallax_system = { - name: "ParallaxSystem", + name: "parallax_system", component_name: "parallax_component", size: sizeof(gc_system), ctr: NULL, diff --git a/src/systems/sfml_renderer_system.c b/src/systems/sfml_renderer_system.c index fe156df..0e4f103 100644 --- a/src/systems/sfml_renderer_system.c +++ b/src/systems/sfml_renderer_system.c @@ -92,7 +92,7 @@ system; const struct sfml_renderer_system sfml_renderer = { { - name: "SfmlrendererSystem", + name: "sfml_renderer_system", component_name: "renderer", size: sizeof(struct sfml_renderer_system), ctr: &sfmlrend_ctr,