mirror of
https://github.com/zoriya/Gamacon.git
synced 2026-06-03 04:02:35 +00:00
Adding a moving camera
This commit is contained in:
@@ -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
@@ -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))
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
@@ -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
|
||||
};
|
||||
@@ -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
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
@@ -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))
|
||||
|
||||
@@ -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}
|
||||
};
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user