diff --git a/Makefile b/Makefile index 551da8b..dec3e1d 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,6 @@ SRC = src/engine/engine.c \ src/engine/engine_internal.c \ src/engine/discard_player.c \ src/engine/engine_dataloader.c \ - src/renderer/sfml_functions.c \ - src/renderer/update_to_cam.c \ src/entity/entity.c \ src/entity/entity_factory.c \ src/component.c \ @@ -43,6 +41,7 @@ SRC = src/engine/engine.c \ src/systems/parallax_system.c \ src/systems/controllers/keyboard_controller_system.c \ src/systems/friction_system.c \ + src/systems/fixed_to_cam_pseudosystem.c \ src/engine/engine_system_builder.c \ src/engine/engine_component_builder.c \ src/utility/vector2.c \ @@ -50,7 +49,8 @@ SRC = src/engine/engine.c \ src/sfml_renderer/sfml_dataloaders.c \ src/sfml_renderer/sfml_music_player.c \ src/sfml_renderer/texture_utility.c \ - src/sfml_renderer/sfml_drawer.c + src/sfml_renderer/sfml_drawer.c \ + src/sfml_renderer/sfml_functions.c OBJ = $(SRC:%.c=%.o) diff --git a/include/components/fixed_to_cam_component.h b/include/components/fixed_to_cam_component.h index 5440082..9e2d794 100644 --- a/include/components/fixed_to_cam_component.h +++ b/include/components/fixed_to_cam_component.h @@ -8,5 +8,12 @@ #pragma once #include "component.h" +#include "vector2.h" -extern const gc_component fixed_to_cam; \ No newline at end of file +struct fixed_to_cam +{ + gc_component base; + gc_vector2 offset; +}; + +extern const struct fixed_to_cam fixed_to_cam; \ No newline at end of file diff --git a/include/engine.h b/include/engine.h index f20756e..8b1ee46 100644 --- a/include/engine.h +++ b/include/engine.h @@ -19,6 +19,7 @@ typedef struct gc_engine gc_engine; struct gc_engine { gc_scene *scene; + bool should_close; bool (*is_open)(gc_engine *engine); bool (*has_focus)(gc_engine *engine); bool (*is_keypressed)(int key); @@ -38,6 +39,7 @@ struct gc_engine const void *(*get_component)(gc_engine *engine, const char *name); void (*play_music)(void *music); + void (*stop_music)(gc_engine *engine); gc_list *dataloaders; void (*add_dataloader)(gc_engine *engine, char *type, gc_loader loader); @@ -50,6 +52,8 @@ bool engine_is_keypressed(int key); void handle_events(gc_engine *engine); void engine_draw(gc_engine *engine); void engine_play_music(void *music); +void engine_stop_music(gc_engine *engine); + int change_scene(gc_engine *engine, gc_scene *scene); void engine_add_buildin_systems(gc_engine *engine); diff --git a/include/sfml_renderer.h b/include/sfml_renderer.h index 4ff06a4..b283ccf 100644 --- a/include/sfml_renderer.h +++ b/include/sfml_renderer.h @@ -29,4 +29,15 @@ struct transform_component *tra, gc_text *txt); void sfml_texture_destroy(gc_data *data); void sfml_music_destroy(gc_data *data); -void sfml_font_destroy(gc_data *data); \ No newline at end of file +void sfml_font_destroy(gc_data *data); + +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); +void sfml_play_music(void *music); +void sfml_stop_music(gc_engine *engine); +void entities_update_to_cam(gc_scene *scene, \ +struct sfml_renderer_system *renderer, struct camerafollow_system *cam); +void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size); diff --git a/include/systems/sfml_renderer_system.h b/include/systems/sfml_renderer_system.h index b7c82af..cea8cd0 100644 --- a/include/systems/sfml_renderer_system.h +++ b/include/systems/sfml_renderer_system.h @@ -24,14 +24,5 @@ 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); -void sfml_play_music(void *music); -void entities_update_to_cam(gc_scene *scene, \ -struct sfml_renderer_system *renderer, struct camerafollow_system *cam); -void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size); extern const struct sfml_renderer_system sfml_renderer; \ No newline at end of file diff --git a/include/xml.h b/include/xml.h index c0f3a39..389ddb3 100644 --- a/include/xml.h +++ b/include/xml.h @@ -10,6 +10,9 @@ typedef struct dictionary dictionary; #pragma once +#include +#include + struct dictionary { char *key; @@ -29,7 +32,9 @@ struct node node *xml_parse(const char *path); node *xml_getnode(node *parent, const char *name); +bool xml_hasproperty(node *n, const char *key); char *xml_getproperty(node *n, const char *key); +char *xml_gettempprop(node *n, const char *key); int xml_getintprop(node *n, const char *key); int xml_getbinaprop(node *n, const char *key); int xml_gethexaprop(node *n, const char *key); diff --git a/src/components/collision_component.c b/src/components/collision_component.c index 5d0bceb..f05e2ce 100644 --- a/src/components/collision_component.c +++ b/src/components/collision_component.c @@ -40,7 +40,10 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) static void dtr(void *component) { - (void)component; + struct collision_component *cmp = (struct collision_component *)component; + + if (cmp->on_collide) + free(cmp->on_collide); } static char *serialize(void *component) diff --git a/src/components/fixed_to_cam.c b/src/components/fixed_to_cam.c index d7ca2ae..7bcf6ab 100644 --- a/src/components/fixed_to_cam.c +++ b/src/components/fixed_to_cam.c @@ -7,27 +7,47 @@ #include "xml.h" #include "component.h" -#include "components/controllable_component.h" -#include "components/camerafollow_component.h" +#include "components/fixed_to_cam_component.h" #include "utility.h" #include +static void ctr(void *component, va_list args) +{ + struct fixed_to_cam *cmp = (struct fixed_to_cam *)component; + + cmp->offset = va_arg(args, gc_vector2); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct fixed_to_cam *cmp = (struct fixed_to_cam *)component; + + n = xml_getnode(n, "Position"); + cmp->offset.x = xml_getintprop(n, "x"); + cmp->offset.y = xml_getintprop(n, "y"); + (void)scene; + (void)entity; +} + 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 +const struct fixed_to_cam fixed_to_cam = { + base: { + name: "fixed_to_cam", + size: sizeof(struct fixed_to_cam), + dependencies: (char *[]){ + "transform_component", + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: NULL, + serialize: &serialize, + destroy: &component_destroy }, - ctr: NULL, - fdctr: NULL, - dtr: NULL, - serialize: &serialize, - destroy: &component_destroy + offset: (gc_vector2){0, 0} }; \ No newline at end of file diff --git a/src/components/renderer.c b/src/components/renderer.c index 3df7e13..6118a41 100644 --- a/src/components/renderer.c +++ b/src/components/renderer.c @@ -9,6 +9,7 @@ #include "xml.h" #include "utility.h" #include "sprite.h" +#include "text.h" #include "components/transform_component.h" #include "components/renderer.h" #include @@ -31,7 +32,7 @@ GC_TEXTURETYPE renderer_get_type(node *n) { if (xml_getnode(n, "animation")) return (GC_ANIMREND); - if (xml_getproperty(n, "text")) + if (xml_hasproperty(n, "text")) return (GC_TXTREND); return (GC_TEXTUREREND); } @@ -54,13 +55,22 @@ static void dtr(void *component) { struct renderer *cmp = (struct renderer *)component; - if (cmp->type == GC_TEXTUREREND) - free(cmp->data); - if (cmp->type == GC_ANIMREND) { + switch (cmp->type) { + case GC_ANIMREND: + for (int i = 0; i < ((gc_animholder *)cmp->data)->animcount; i++) { + if (my_strcmp(((gc_animholder *)cmp->data)->anims[i].name, "none")) + free(((gc_animholder *)cmp->data)->anims[i].name); + } free(((gc_animholder *)cmp->data)->sprite); free(((gc_animholder *)cmp->data)->anims); - free(cmp->data); + break; + case GC_TXTREND: + free(((gc_text *)cmp->data)->text); + break; + default: + break; } + free(cmp->data); } static char *serialize(void *component) diff --git a/src/components/renderers/sprite_renderer.c b/src/components/renderers/sprite_renderer.c index fddea25..7447380 100644 --- a/src/components/renderers/sprite_renderer.c +++ b/src/components/renderers/sprite_renderer.c @@ -41,7 +41,7 @@ void sprite_fdctr(gc_scene *scene, struct renderer *cmp, node *n) cmp->data = sprite; if (!cmp->data) return; - sprite->texture = get_texture(scene, xml_getproperty(n, "src")); + sprite->texture = get_texture(scene, xml_gettempprop(n, "src")); sprite->rect.height = xml_getfloatprop(rect, "height"); sprite->rect.width = xml_getfloatprop(rect, "width"); sprite->rect.top = xml_getfloatprop(rect, "top"); diff --git a/src/engine/discard_player.c b/src/engine/discard_player.c index bcd8d32..33dbecd 100644 --- a/src/engine/discard_player.c +++ b/src/engine/discard_player.c @@ -5,7 +5,14 @@ ** discard_player */ +#include "engine.h" + void engine_play_music(void *music) { (void)music; +} + +void engine_stop_music(gc_engine *engine) +{ + (void)engine; } \ No newline at end of file diff --git a/src/engine/engine.c b/src/engine/engine.c index 9b1063f..948a491 100644 --- a/src/engine/engine.c +++ b/src/engine/engine.c @@ -46,6 +46,11 @@ void engine_destroy(gc_engine *engine) if (engine->scene) engine->scene->destroy(engine->scene); + for (gc_list *dl = engine->dataloaders; dl; dl = next) { + next = dl->next; + free(dl->data); + free(dl); + } for (gc_list *system = engine->systems; system; system = next) { next = system->next; ((gc_system *)system->data)->destroy(system->data); @@ -65,6 +70,7 @@ gc_engine *engine_create(void) if (!engine) return (NULL); engine->scene = NULL; + engine->should_close = false; engine->is_open = &engine_is_open; engine->has_focus = &engine_has_focus; engine->is_keypressed = &engine_is_keypressed; @@ -73,6 +79,7 @@ gc_engine *engine_create(void) engine->draw = &engine_draw; engine->change_scene = &change_scene; engine->play_music = &engine_play_music; + engine->stop_music = &engine_stop_music; engine->destroy = &engine_destroy; engine_add_buildin_systems(engine); engine_add_buildin_components(engine); diff --git a/src/scene/scene.c b/src/scene/scene.c index 2cf47ce..8e2c649 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -62,6 +62,7 @@ int change_scene(gc_engine *engine, gc_scene *scene) { void *music = scene->get_data(scene, "music", NULL); + engine->stop_music(engine); if (engine->scene) engine->scene->destroy(engine->scene); engine->scene = scene; @@ -84,6 +85,8 @@ void scene_destroy(gc_scene *scene) next = data->next; if (((gc_data *)data->data)->destroy) ((gc_data *)data->data)->destroy(data->data); + free(((gc_data *)data->data)->type); + free(data->data); free(data); } for (gc_tupple *tupple = tup; tupple; tupple = tup) { diff --git a/src/sfml_renderer/sfml_dataloaders.c b/src/sfml_renderer/sfml_dataloaders.c index adf7c9e..0c0a887 100644 --- a/src/sfml_renderer/sfml_dataloaders.c +++ b/src/sfml_renderer/sfml_dataloaders.c @@ -33,7 +33,7 @@ int sfml_sprite_loader(gc_data *data, node *n) if (!path) return (-1); - data->name = my_strdup(path); + data->name = path; data->custom = sfTexture_createFromFile(path, NULL); if (!data->custom || !data->name) return (-1); @@ -48,7 +48,7 @@ int sfml_font_loader(gc_data *data, node *n) if (!path) return (-1); - data->name = my_strdup(path); + data->name = path; data->custom = sfFont_createFromFile(path); if (!data->custom || !data->name) return (-1); diff --git a/src/renderer/sfml_functions.c b/src/sfml_renderer/sfml_functions.c similarity index 87% rename from src/renderer/sfml_functions.c rename to src/sfml_renderer/sfml_functions.c index bc417f3..9bd7cd2 100644 --- a/src/renderer/sfml_functions.c +++ b/src/sfml_renderer/sfml_functions.c @@ -7,6 +7,7 @@ #include "engine.h" #include +#include "sfml_renderer.h" #include "systems/sfml_renderer_system.h" #include "systems/camerafollow_system.h" #include "components/transform_component.h" @@ -15,6 +16,8 @@ bool sfml_is_open(gc_engine *engine) { struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system); + if (engine->should_close) + return (false); return (sfRenderWindow_isOpen(renderer->window)); } @@ -43,10 +46,10 @@ void sfml_handle_events(gc_engine *engine) event.size.width, event.size.height }); - entities_update_to_cam_size(engine->scene, (gc_vector2) { - event.size.width, - event.size.height - }); + // entities_update_to_cam_size(engine->scene, (gc_vector2) { + // event.size.width, + // event.size.height + // }); } } } diff --git a/src/sfml_renderer/sfml_music_player.c b/src/sfml_renderer/sfml_music_player.c index ddcb304..92a54c9 100644 --- a/src/sfml_renderer/sfml_music_player.c +++ b/src/sfml_renderer/sfml_music_player.c @@ -12,4 +12,14 @@ void sfml_play_music(void *music) { sfMusic_setLoop(music, true); sfMusic_play(music); +} + +void sfml_stop_music(gc_engine *engine) +{ + void *music; + + if (!engine->scene) + return; + music = engine->scene->get_data(engine->scene, "music", NULL); + sfMusic_stop(music); } \ No newline at end of file diff --git a/src/systems/camera_follow_system.c b/src/systems/camera_follow_system.c index b3ea169..2a8c883 100644 --- a/src/systems/camera_follow_system.c +++ b/src/systems/camera_follow_system.c @@ -35,11 +35,6 @@ static void ctr(void *system, va_list args) (void)args; } -static void destroy(void *system) -{ - (void)system; -} - const struct camerafollow_system camerafollow_system = { base: { name: "camerafollow_system", @@ -49,7 +44,7 @@ const struct camerafollow_system camerafollow_system = { dtr: NULL, check_dependencies: &system_check_dependencies, update_entity: &update_entity, - destroy: &destroy + destroy: &system_destroy }, cam_pos: (gc_vector2){0, 0} }; \ No newline at end of file diff --git a/src/renderer/update_to_cam.c b/src/systems/fixed_to_cam_pseudosystem.c similarity index 63% rename from src/renderer/update_to_cam.c rename to src/systems/fixed_to_cam_pseudosystem.c index 7a0f5cd..a45c36a 100644 --- a/src/renderer/update_to_cam.c +++ b/src/systems/fixed_to_cam_pseudosystem.c @@ -8,8 +8,11 @@ #include "entity.h" #include "scene.h" #include "systems/camerafollow_system.h" +#include "component.h" #include "components/transform_component.h" +#include "components/fixed_to_cam_component.h" #include "systems/sfml_renderer_system.h" +#include "my.h" #include void entities_update_to_cam(gc_scene *scene, \ @@ -18,14 +21,20 @@ struct sfml_renderer_system *renderer, struct camerafollow_system *cam) gc_list *list; gc_entity *entity; sfVector2f size; + gc_vector2 offset; + struct transform_component *tra; list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); for (gc_list *li = list; li; li = li->next) { entity = (gc_entity *)li->data; + tra = GETCMP(transform_component); + if (!tra) + continue; 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, + offset = GETCMP(fixed_to_cam)->offset; + tra->position = (gc_vector2) { + cam->cam_pos.x - size.x / 2 + offset.x, + cam->cam_pos.y + size.y / 2 - offset.y, }; } } @@ -34,11 +43,15 @@ void entities_update_to_cam_size(gc_scene *scene, gc_vector2 size) { gc_list *list; gc_entity *entity; + struct transform_component *tra; list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); for (gc_list *li = list; li; li = li->next) { entity = (gc_entity *)li->data; - GETCMP(transform_component)->size = (gc_vector2) { + tra = GETCMP(transform_component); + if (!tra) + continue; + tra->size = (gc_vector2) { size.x, size.y }; diff --git a/src/systems/sfml_renderer_system.c b/src/systems/sfml_renderer_system.c index 8249126..f9acb10 100644 --- a/src/systems/sfml_renderer_system.c +++ b/src/systems/sfml_renderer_system.c @@ -52,6 +52,7 @@ void sfml_setup_options(gc_engine *engine) engine->handle_events = &sfml_handle_events; engine->draw = &sfml_draw; engine->play_music = &sfml_play_music; + engine->stop_music = &sfml_stop_music; } void sfmlrend_ctr(void *rend, va_list list) @@ -83,6 +84,7 @@ system; sfRenderWindow_destroy(renderer->window); sfSprite_destroy(renderer->sprite); + sfText_destroy(renderer->text); sfView_destroy(renderer->view); } diff --git a/src/utility/my_realloc.c b/src/utility/my_realloc.c index 717a88d..481c696 100644 --- a/src/utility/my_realloc.c +++ b/src/utility/my_realloc.c @@ -17,5 +17,7 @@ void *my_realloc(void *oldptr, size_t oldsize, size_t newsize) ((char *)new)[i] = ((char *)oldptr)[i]; } } + if (oldptr) + free(oldptr); return (new); } \ No newline at end of file