Adding a moving camera

This commit is contained in:
AnonymusRaccoon
2020-01-07 15:45:23 +01:00
parent c534d3c190
commit 7903b83a26
21 changed files with 264 additions and 24 deletions
+4
View File
@@ -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 \
@@ -0,0 +1,12 @@
/*
** EPITECH PROJECT, 2019
** Gamacon
** File description:
** movable_component
*/
#pragma once
#include "component.h"
extern const gc_component camerafollow_component;
@@ -0,0 +1,12 @@
/*
** EPITECH PROJECT, 2019
** Gamacon
** File description:
** movable_component
*/
#pragma once
#include "component.h"
extern const gc_component fixed_to_cam;
+7 -5
View File
@@ -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);
int engine_use_sfml(gc_engine *engine, const char *title, int framerate);
#define GETSYS(x) ((struct x *)engine->get_system(engine, #x))
+18
View File
@@ -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;
+5
View File
@@ -9,6 +9,9 @@
#include "system.h"
#include <SFML/Graphics.h>
#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;
+52
View File
@@ -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 <stdlib.h>
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
};
+33
View File
@@ -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 <stdlib.h>
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
};
+2 -1
View File
@@ -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);
}
+4
View File
@@ -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, &parallax_component);
engine->add_component(engine, &controllable_component);
engine->add_component(engine, &keyboard_controller);
+6 -3
View File
@@ -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 <stdlib.h>
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);
}
+15 -8
View File
@@ -8,19 +8,19 @@
#include "engine.h"
#include <SFML/Graphics.h>
#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);
}
+31
View File
@@ -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 <SFML/Graphics.h>
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,
};
}
}
+1 -1
View File
@@ -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))
+56
View File
@@ -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 <stddef.h>
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}
};
+1 -1
View File
@@ -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,
@@ -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,
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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,
+1 -1
View File
@@ -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,