Freeing everything now

This commit is contained in:
Anonymus Raccoon
2020-01-11 17:50:20 +01:00
parent a1e4936dba
commit bf80bda8a2
20 changed files with 143 additions and 50 deletions
+3 -3
View File
@@ -9,8 +9,6 @@ SRC = src/engine/engine.c \
src/engine/engine_internal.c \ src/engine/engine_internal.c \
src/engine/discard_player.c \ src/engine/discard_player.c \
src/engine/engine_dataloader.c \ src/engine/engine_dataloader.c \
src/renderer/sfml_functions.c \
src/renderer/update_to_cam.c \
src/entity/entity.c \ src/entity/entity.c \
src/entity/entity_factory.c \ src/entity/entity_factory.c \
src/component.c \ src/component.c \
@@ -43,6 +41,7 @@ SRC = src/engine/engine.c \
src/systems/parallax_system.c \ src/systems/parallax_system.c \
src/systems/controllers/keyboard_controller_system.c \ src/systems/controllers/keyboard_controller_system.c \
src/systems/friction_system.c \ src/systems/friction_system.c \
src/systems/fixed_to_cam_pseudosystem.c \
src/engine/engine_system_builder.c \ src/engine/engine_system_builder.c \
src/engine/engine_component_builder.c \ src/engine/engine_component_builder.c \
src/utility/vector2.c \ src/utility/vector2.c \
@@ -50,7 +49,8 @@ SRC = src/engine/engine.c \
src/sfml_renderer/sfml_dataloaders.c \ src/sfml_renderer/sfml_dataloaders.c \
src/sfml_renderer/sfml_music_player.c \ src/sfml_renderer/sfml_music_player.c \
src/sfml_renderer/texture_utility.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) OBJ = $(SRC:%.c=%.o)
+8 -1
View File
@@ -8,5 +8,12 @@
#pragma once #pragma once
#include "component.h" #include "component.h"
#include "vector2.h"
extern const gc_component fixed_to_cam; struct fixed_to_cam
{
gc_component base;
gc_vector2 offset;
};
extern const struct fixed_to_cam fixed_to_cam;
+4
View File
@@ -19,6 +19,7 @@ typedef struct gc_engine gc_engine;
struct gc_engine struct gc_engine
{ {
gc_scene *scene; gc_scene *scene;
bool should_close;
bool (*is_open)(gc_engine *engine); bool (*is_open)(gc_engine *engine);
bool (*has_focus)(gc_engine *engine); bool (*has_focus)(gc_engine *engine);
bool (*is_keypressed)(int key); bool (*is_keypressed)(int key);
@@ -38,6 +39,7 @@ struct gc_engine
const void *(*get_component)(gc_engine *engine, const char *name); const void *(*get_component)(gc_engine *engine, const char *name);
void (*play_music)(void *music); void (*play_music)(void *music);
void (*stop_music)(gc_engine *engine);
gc_list *dataloaders; gc_list *dataloaders;
void (*add_dataloader)(gc_engine *engine, char *type, gc_loader loader); 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 handle_events(gc_engine *engine);
void engine_draw(gc_engine *engine); void engine_draw(gc_engine *engine);
void engine_play_music(void *music); void engine_play_music(void *music);
void engine_stop_music(gc_engine *engine);
int change_scene(gc_engine *engine, gc_scene *scene); int change_scene(gc_engine *engine, gc_scene *scene);
void engine_add_buildin_systems(gc_engine *engine); void engine_add_buildin_systems(gc_engine *engine);
+12 -1
View File
@@ -29,4 +29,15 @@ struct transform_component *tra, gc_text *txt);
void sfml_texture_destroy(gc_data *data); void sfml_texture_destroy(gc_data *data);
void sfml_music_destroy(gc_data *data); void sfml_music_destroy(gc_data *data);
void sfml_font_destroy(gc_data *data); 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);
-9
View File
@@ -24,14 +24,5 @@ struct sfml_renderer_system
gc_system *gc_new_sfml_renderer(gc_engine *engine, \ gc_system *gc_new_sfml_renderer(gc_engine *engine, \
const char *title, int framerate); 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; extern const struct sfml_renderer_system sfml_renderer;
+5
View File
@@ -10,6 +10,9 @@ typedef struct dictionary dictionary;
#pragma once #pragma once
#include <stddef.h>
#include <stdbool.h>
struct dictionary struct dictionary
{ {
char *key; char *key;
@@ -29,7 +32,9 @@ struct node
node *xml_parse(const char *path); node *xml_parse(const char *path);
node *xml_getnode(node *parent, const char *name); 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_getproperty(node *n, const char *key);
char *xml_gettempprop(node *n, const char *key);
int xml_getintprop(node *n, const char *key); int xml_getintprop(node *n, const char *key);
int xml_getbinaprop(node *n, const char *key); int xml_getbinaprop(node *n, const char *key);
int xml_gethexaprop(node *n, const char *key); int xml_gethexaprop(node *n, const char *key);
+4 -1
View File
@@ -40,7 +40,10 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
static void dtr(void *component) 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) static char *serialize(void *component)
+33 -13
View File
@@ -7,27 +7,47 @@
#include "xml.h" #include "xml.h"
#include "component.h" #include "component.h"
#include "components/controllable_component.h" #include "components/fixed_to_cam_component.h"
#include "components/camerafollow_component.h"
#include "utility.h" #include "utility.h"
#include <stdlib.h> #include <stdlib.h>
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) static char *serialize(void *component)
{ {
(void)component; (void)component;
return (NULL); return (NULL);
} }
const gc_component fixed_to_cam = { const struct fixed_to_cam fixed_to_cam = {
name: "fixed_to_cam", base: {
size: sizeof(struct gc_component), name: "fixed_to_cam",
dependencies: (char *[]){ size: sizeof(struct fixed_to_cam),
"transform_component", dependencies: (char *[]){
NULL "transform_component",
NULL
},
ctr: &ctr,
fdctr: &fdctr,
dtr: NULL,
serialize: &serialize,
destroy: &component_destroy
}, },
ctr: NULL, offset: (gc_vector2){0, 0}
fdctr: NULL,
dtr: NULL,
serialize: &serialize,
destroy: &component_destroy
}; };
+15 -5
View File
@@ -9,6 +9,7 @@
#include "xml.h" #include "xml.h"
#include "utility.h" #include "utility.h"
#include "sprite.h" #include "sprite.h"
#include "text.h"
#include "components/transform_component.h" #include "components/transform_component.h"
#include "components/renderer.h" #include "components/renderer.h"
#include <stdlib.h> #include <stdlib.h>
@@ -31,7 +32,7 @@ GC_TEXTURETYPE renderer_get_type(node *n)
{ {
if (xml_getnode(n, "animation")) if (xml_getnode(n, "animation"))
return (GC_ANIMREND); return (GC_ANIMREND);
if (xml_getproperty(n, "text")) if (xml_hasproperty(n, "text"))
return (GC_TXTREND); return (GC_TXTREND);
return (GC_TEXTUREREND); return (GC_TEXTUREREND);
} }
@@ -54,13 +55,22 @@ static void dtr(void *component)
{ {
struct renderer *cmp = (struct renderer *)component; struct renderer *cmp = (struct renderer *)component;
if (cmp->type == GC_TEXTUREREND) switch (cmp->type) {
free(cmp->data); case GC_ANIMREND:
if (cmp->type == 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)->sprite);
free(((gc_animholder *)cmp->data)->anims); 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) static char *serialize(void *component)
+1 -1
View File
@@ -41,7 +41,7 @@ void sprite_fdctr(gc_scene *scene, struct renderer *cmp, node *n)
cmp->data = sprite; cmp->data = sprite;
if (!cmp->data) if (!cmp->data)
return; 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.height = xml_getfloatprop(rect, "height");
sprite->rect.width = xml_getfloatprop(rect, "width"); sprite->rect.width = xml_getfloatprop(rect, "width");
sprite->rect.top = xml_getfloatprop(rect, "top"); sprite->rect.top = xml_getfloatprop(rect, "top");
+7
View File
@@ -5,7 +5,14 @@
** discard_player ** discard_player
*/ */
#include "engine.h"
void engine_play_music(void *music) void engine_play_music(void *music)
{ {
(void)music; (void)music;
}
void engine_stop_music(gc_engine *engine)
{
(void)engine;
} }
+7
View File
@@ -46,6 +46,11 @@ void engine_destroy(gc_engine *engine)
if (engine->scene) if (engine->scene)
engine->scene->destroy(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) { for (gc_list *system = engine->systems; system; system = next) {
next = system->next; next = system->next;
((gc_system *)system->data)->destroy(system->data); ((gc_system *)system->data)->destroy(system->data);
@@ -65,6 +70,7 @@ gc_engine *engine_create(void)
if (!engine) if (!engine)
return (NULL); return (NULL);
engine->scene = NULL; engine->scene = NULL;
engine->should_close = false;
engine->is_open = &engine_is_open; engine->is_open = &engine_is_open;
engine->has_focus = &engine_has_focus; engine->has_focus = &engine_has_focus;
engine->is_keypressed = &engine_is_keypressed; engine->is_keypressed = &engine_is_keypressed;
@@ -73,6 +79,7 @@ gc_engine *engine_create(void)
engine->draw = &engine_draw; engine->draw = &engine_draw;
engine->change_scene = &change_scene; engine->change_scene = &change_scene;
engine->play_music = &engine_play_music; engine->play_music = &engine_play_music;
engine->stop_music = &engine_stop_music;
engine->destroy = &engine_destroy; engine->destroy = &engine_destroy;
engine_add_buildin_systems(engine); engine_add_buildin_systems(engine);
engine_add_buildin_components(engine); engine_add_buildin_components(engine);
+3
View File
@@ -62,6 +62,7 @@ int change_scene(gc_engine *engine, gc_scene *scene)
{ {
void *music = scene->get_data(scene, "music", NULL); void *music = scene->get_data(scene, "music", NULL);
engine->stop_music(engine);
if (engine->scene) if (engine->scene)
engine->scene->destroy(engine->scene); engine->scene->destroy(engine->scene);
engine->scene = scene; engine->scene = scene;
@@ -84,6 +85,8 @@ void scene_destroy(gc_scene *scene)
next = data->next; next = data->next;
if (((gc_data *)data->data)->destroy) if (((gc_data *)data->data)->destroy)
((gc_data *)data->data)->destroy(data->data); ((gc_data *)data->data)->destroy(data->data);
free(((gc_data *)data->data)->type);
free(data->data);
free(data); free(data);
} }
for (gc_tupple *tupple = tup; tupple; tupple = tup) { for (gc_tupple *tupple = tup; tupple; tupple = tup) {
+2 -2
View File
@@ -33,7 +33,7 @@ int sfml_sprite_loader(gc_data *data, node *n)
if (!path) if (!path)
return (-1); return (-1);
data->name = my_strdup(path); data->name = path;
data->custom = sfTexture_createFromFile(path, NULL); data->custom = sfTexture_createFromFile(path, NULL);
if (!data->custom || !data->name) if (!data->custom || !data->name)
return (-1); return (-1);
@@ -48,7 +48,7 @@ int sfml_font_loader(gc_data *data, node *n)
if (!path) if (!path)
return (-1); return (-1);
data->name = my_strdup(path); data->name = path;
data->custom = sfFont_createFromFile(path); data->custom = sfFont_createFromFile(path);
if (!data->custom || !data->name) if (!data->custom || !data->name)
return (-1); return (-1);
@@ -7,6 +7,7 @@
#include "engine.h" #include "engine.h"
#include <SFML/Graphics.h> #include <SFML/Graphics.h>
#include "sfml_renderer.h"
#include "systems/sfml_renderer_system.h" #include "systems/sfml_renderer_system.h"
#include "systems/camerafollow_system.h" #include "systems/camerafollow_system.h"
#include "components/transform_component.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); struct sfml_renderer_system *renderer = GETSYS(sfml_renderer_system);
if (engine->should_close)
return (false);
return (sfRenderWindow_isOpen(renderer->window)); return (sfRenderWindow_isOpen(renderer->window));
} }
@@ -43,10 +46,10 @@ void sfml_handle_events(gc_engine *engine)
event.size.width, event.size.width,
event.size.height event.size.height
}); });
entities_update_to_cam_size(engine->scene, (gc_vector2) { // entities_update_to_cam_size(engine->scene, (gc_vector2) {
event.size.width, // event.size.width,
event.size.height // event.size.height
}); // });
} }
} }
} }
+10
View File
@@ -12,4 +12,14 @@ void sfml_play_music(void *music)
{ {
sfMusic_setLoop(music, true); sfMusic_setLoop(music, true);
sfMusic_play(music); 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);
} }
+1 -6
View File
@@ -35,11 +35,6 @@ static void ctr(void *system, va_list args)
(void)args; (void)args;
} }
static void destroy(void *system)
{
(void)system;
}
const struct camerafollow_system camerafollow_system = { const struct camerafollow_system camerafollow_system = {
base: { base: {
name: "camerafollow_system", name: "camerafollow_system",
@@ -49,7 +44,7 @@ const struct camerafollow_system camerafollow_system = {
dtr: NULL, dtr: NULL,
check_dependencies: &system_check_dependencies, check_dependencies: &system_check_dependencies,
update_entity: &update_entity, update_entity: &update_entity,
destroy: &destroy destroy: &system_destroy
}, },
cam_pos: (gc_vector2){0, 0} cam_pos: (gc_vector2){0, 0}
}; };
@@ -8,8 +8,11 @@
#include "entity.h" #include "entity.h"
#include "scene.h" #include "scene.h"
#include "systems/camerafollow_system.h" #include "systems/camerafollow_system.h"
#include "component.h"
#include "components/transform_component.h" #include "components/transform_component.h"
#include "components/fixed_to_cam_component.h"
#include "systems/sfml_renderer_system.h" #include "systems/sfml_renderer_system.h"
#include "my.h"
#include <SFML/Graphics.h> #include <SFML/Graphics.h>
void entities_update_to_cam(gc_scene *scene, \ 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_list *list;
gc_entity *entity; gc_entity *entity;
sfVector2f size; sfVector2f size;
gc_vector2 offset;
struct transform_component *tra;
list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); list = scene->get_entity_by_cmp(scene, "fixed_to_cam");
for (gc_list *li = list; li; li = li->next) { for (gc_list *li = list; li; li = li->next) {
entity = (gc_entity *)li->data; entity = (gc_entity *)li->data;
tra = GETCMP(transform_component);
if (!tra)
continue;
size = sfView_getSize(renderer->view); size = sfView_getSize(renderer->view);
GETCMP(transform_component)->position = (gc_vector2) { offset = GETCMP(fixed_to_cam)->offset;
cam->cam_pos.x - size.x / 2, tra->position = (gc_vector2) {
cam->cam_pos.y + size.y / 2, 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_list *list;
gc_entity *entity; gc_entity *entity;
struct transform_component *tra;
list = scene->get_entity_by_cmp(scene, "fixed_to_cam"); list = scene->get_entity_by_cmp(scene, "fixed_to_cam");
for (gc_list *li = list; li; li = li->next) { for (gc_list *li = list; li; li = li->next) {
entity = (gc_entity *)li->data; 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.x,
size.y size.y
}; };
+2
View File
@@ -52,6 +52,7 @@ void sfml_setup_options(gc_engine *engine)
engine->handle_events = &sfml_handle_events; engine->handle_events = &sfml_handle_events;
engine->draw = &sfml_draw; engine->draw = &sfml_draw;
engine->play_music = &sfml_play_music; engine->play_music = &sfml_play_music;
engine->stop_music = &sfml_stop_music;
} }
void sfmlrend_ctr(void *rend, va_list list) void sfmlrend_ctr(void *rend, va_list list)
@@ -83,6 +84,7 @@ system;
sfRenderWindow_destroy(renderer->window); sfRenderWindow_destroy(renderer->window);
sfSprite_destroy(renderer->sprite); sfSprite_destroy(renderer->sprite);
sfText_destroy(renderer->text);
sfView_destroy(renderer->view); sfView_destroy(renderer->view);
} }
+2
View File
@@ -17,5 +17,7 @@ void *my_realloc(void *oldptr, size_t oldsize, size_t newsize)
((char *)new)[i] = ((char *)oldptr)[i]; ((char *)new)[i] = ((char *)oldptr)[i];
} }
} }
if (oldptr)
free(oldptr);
return (new); return (new);
} }