From fa4650a19789d6a640e5392b4d219ed71262aae7 Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Thu, 12 Mar 2020 16:46:15 +0100 Subject: [PATCH] Allowing the camera to be placed at a position --- include/sfml_renderer.h | 3 ++- include/systems/camerafollow_system.h | 1 + src/engine/engine_system_builder.c | 1 + src/scene/scene_loader.c | 2 ++ src/sfml_renderer/sfml_dataloaders.c | 14 ++++++++++++++ src/sfml_renderer/sfml_functions.c | 6 +++--- src/systems/camera_follow_system.c | 2 ++ src/systems/fixed_to_cam_pseudosystem.c | 7 ++++--- 8 files changed, 29 insertions(+), 7 deletions(-) diff --git a/include/sfml_renderer.h b/include/sfml_renderer.h index c55c465..3970f93 100644 --- a/include/sfml_renderer.h +++ b/include/sfml_renderer.h @@ -18,6 +18,7 @@ gc_data *sfml_music_loader(gc_engine *engine, gc_scene *scene, node *n); gc_data *sfml_sprite_loader(gc_engine *engine, gc_scene *scene, node *n); gc_data *sfml_font_loader(gc_engine *engine, gc_scene *scene, node *n); +gc_data *sfml_camera(gc_engine *engine, gc_scene *scene, node *n); sfTexture *get_texture(gc_scene *scene, char *name); sfVertexArray *sfml_init_verticies(void); @@ -49,5 +50,5 @@ gc_vector2 sfml_get_screen_size(gc_engine *engine); gc_vector2 sfml_engine_get_cursor_pos(gc_engine *engine); void entities_update_to_cam(gc_scene *scene, \ -struct sfml_renderer_system *renderer, struct camerafollow_system *cam); +struct sfml_renderer_system *renderer); void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size); diff --git a/include/systems/camerafollow_system.h b/include/systems/camerafollow_system.h index d6246ef..0755dd1 100644 --- a/include/systems/camerafollow_system.h +++ b/include/systems/camerafollow_system.h @@ -13,6 +13,7 @@ struct camerafollow_system { gc_system base; gc_vector2 cam_pos; + bool enabled; }; extern const struct camerafollow_system camerafollow_system; \ No newline at end of file diff --git a/src/engine/engine_system_builder.c b/src/engine/engine_system_builder.c index a17c72f..2879261 100644 --- a/src/engine/engine_system_builder.c +++ b/src/engine/engine_system_builder.c @@ -54,5 +54,6 @@ int engine_use_sfml(gc_engine *engine, const char *title, int framerate) engine->add_dataloader(engine, "music", &sfml_music_loader); engine->add_dataloader(engine, "sprite", &sfml_sprite_loader); engine->add_dataloader(engine, "font", &sfml_font_loader); + engine->add_dataloader(engine, "camera", &sfml_camera); return (0); } \ No newline at end of file diff --git a/src/scene/scene_loader.c b/src/scene/scene_loader.c index c19e309..93e48e5 100644 --- a/src/scene/scene_loader.c +++ b/src/scene/scene_loader.c @@ -48,6 +48,8 @@ void scene_load_entity(gc_scene *this, gc_engine *engine, node *n, int prefab) return; } data = loader->load(engine, this, n); + if (!data) + return; for (gc_list *li = (gc_list *)data->custom; li; li = li->next) { ((gc_entity *)li->data)->prefab_id = prefab; this->add_entity(this, li->data); diff --git a/src/sfml_renderer/sfml_dataloaders.c b/src/sfml_renderer/sfml_dataloaders.c index f8a0e64..a249ee8 100644 --- a/src/sfml_renderer/sfml_dataloaders.c +++ b/src/sfml_renderer/sfml_dataloaders.c @@ -65,4 +65,18 @@ gc_data *sfml_font_loader(gc_engine *engine, gc_scene *scene, node *n) return (NULL); data->destroy = &sfml_font_destroy; return (data); +} + +gc_data *sfml_camera(gc_engine *engine, gc_scene *scene, node *n) +{ + struct sfml_renderer_system *rend = GETSYS(engine, sfml_renderer_system); + + if (!rend) + my_printf("The sfml is not found. Could not change the position\ + of the camera.\n"); + sfView_setCenter(rend->view, (sfVector2f){ + xml_getfloatprop(n, "x"), + -xml_getfloatprop(n, "y") + }); + return (NULL); } \ No newline at end of file diff --git a/src/sfml_renderer/sfml_functions.c b/src/sfml_renderer/sfml_functions.c index c5f3dde..e75a2fe 100644 --- a/src/sfml_renderer/sfml_functions.c +++ b/src/sfml_renderer/sfml_functions.c @@ -39,14 +39,14 @@ void sfml_draw(gc_engine *engine) struct sfml_renderer_system *rend = GETSYS(engine, sfml_renderer_system); struct camerafollow_system *cam = GETSYS(engine, camerafollow_system); - if (cam) { + if (cam && cam->enabled) { sfView_setCenter(rend->view, (sfVector2f){ cam->cam_pos.x, -cam->cam_pos.y }); - sfRenderWindow_setView(rend->window, rend->view); - entities_update_to_cam(engine->scene, rend, cam); } + entities_update_to_cam(engine->scene, rend); + sfRenderWindow_setView(rend->window, rend->view); sfRenderWindow_display(rend->window); sfRenderWindow_clear(rend->window, sfBlack); } \ No newline at end of file diff --git a/src/systems/camera_follow_system.c b/src/systems/camera_follow_system.c index 90325f7..7adae56 100644 --- a/src/systems/camera_follow_system.c +++ b/src/systems/camera_follow_system.c @@ -23,6 +23,7 @@ gc_entity *entity, float dtime) sys->cam_pos.x = (sys->cam_pos.x + tra->position.x) / 2; sys->cam_pos.y = (sys->cam_pos.y + tra->position.y) / 2; + sys->enabled = true; (void)engine; (void)dtime; } @@ -32,6 +33,7 @@ static void ctr(void *system, va_list args) struct camerafollow_system *sys = (struct camerafollow_system *)system; sys->cam_pos = (gc_vector2){0, 0}; + sys->enabled = false; (void)args; } diff --git a/src/systems/fixed_to_cam_pseudosystem.c b/src/systems/fixed_to_cam_pseudosystem.c index e2b0746..b673a0f 100644 --- a/src/systems/fixed_to_cam_pseudosystem.c +++ b/src/systems/fixed_to_cam_pseudosystem.c @@ -16,7 +16,7 @@ #include void entities_update_to_cam(gc_scene *scene, \ -struct sfml_renderer_system *renderer, struct camerafollow_system *cam) +struct sfml_renderer_system *renderer) { gc_list *list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); @@ -25,8 +25,9 @@ struct sfml_renderer_system *renderer, struct camerafollow_system *cam) struct transform_component *tra = GETCMP(entity, transform_component); struct fixed_to_cam *fc = GETCMP(entity, fixed_to_cam); sfVector2f size = sfView_getSize(renderer->view); - float x = (cam->cam_pos.x - size.x / 2); - float y = (cam->cam_pos.y + size.y / 2); + sfVector2f pos = sfView_getCenter(renderer->view); + float x = pos.x - size.x / 2; + float y = -pos.y + size.y / 2; if (!tra) continue;