This commit is contained in:
Clément Le Bihan
2020-03-09 00:31:44 +01:00
15 changed files with 129 additions and 15 deletions
+2 -1
View File
@@ -32,6 +32,7 @@ void *new_component(const void *component, ...);
void component_destroy(void *component); void component_destroy(void *component);
gc_component *component_remove(gc_component *cmp, const char *name); gc_component *component_remove(gc_component *cmp, const char *name);
#define GETCMP(entity, x) ((struct x *)entity->get_component(entity, #x)) #define GETCMP(entity, x) ((struct x *)((gc_entity *)entity)->\
get_component(entity, #x))
#define GETCOLCMP(x) ((struct x *)entity_get_component(\ #define GETCOLCMP(x) ((struct x *)entity_get_component(\
entity_get(engine->scene, id), #x)) entity_get(engine->scene, id), #x))
+18
View File
@@ -0,0 +1,18 @@
//
// Created by anonymus-raccoon on 3/3/20.
//
#ifndef _TAG_COMPONENT_H_
#define _TAG_COMPONENT_H_
#include "component.h"
struct tag_component
{
gc_component base;
char *tag;
};
const struct tag_component tag_component;
#endif //_TAG_COMPONENT_H_
+1 -1
View File
@@ -23,7 +23,7 @@ struct gc_entity
void (*remove_component)(const gc_scene *scene, const gc_entity *entity, \ void (*remove_component)(const gc_scene *scene, const gc_entity *entity, \
const char *name); const char *name);
char *(*serialize)(gc_entity *entity, int fd); char *(*serialize)(gc_entity *entity, int fd);
void (*destroy)(gc_entity *entity); void (*destroy)(gc_entity *entity, gc_scene *scene);
}; };
gc_entity *entity_create(void); gc_entity *entity_create(void);
+3 -1
View File
@@ -16,5 +16,7 @@ struct gc_list
}; };
gc_list *list_add(gc_list *list, void *obj); gc_list *list_add(gc_list *list, void *obj);
gc_list *list_remove(gc_list *list, void *obj);
#define LISTADD(list, obj) (list = list_add(list, obj)) #define LISTADD(list, obj) (list = list_add(list, obj))
#define LISTREM(list, obj) (list = list_remove(list, obj))
+3 -1
View File
@@ -11,4 +11,6 @@
int prefab_load(gc_engine *engine, const char *path); int prefab_load(gc_engine *engine, const char *path);
int prefab_loadentities(node *n, gc_engine *engine, gc_scene *scene); int prefab_loadentities(node *n, gc_engine *engine, gc_scene *scene);
gc_entity *deserialize_entity(gc_engine *engine, gc_scene *scene, node *n); gc_entity *deserialize_entity(gc_engine *engine, gc_scene *scene, node *n);
gc_component *deserialize_component(gc_engine *engine, gc_entity *entity, \
gc_scene *scene, node *n);
+55
View File
@@ -0,0 +1,55 @@
/*
** EPITECH PROJECT, 2019
** MUL_my_runner_2019
** File description:
** parralax_component
*/
#include "components/tag_component.h"
#include <malloc.h>
#include "xml.h"
#include "components/parallax_component.h"
#include "components/transform_component.h"
static void ctr(void *component, va_list args)
{
struct tag_component *cmp = (struct tag_component *)component;
cmp->tag = va_arg(args, char *);
}
static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
{
struct tag_component *cmp = (struct tag_component *)component;
cmp->tag = xml_getproperty(n, "tag");
(void)scene;
(void)entity;
}
static void dtr(void *component)
{
struct tag_component *cmp = (struct tag_component *)component;
free(cmp->tag);
}
static char *serialize(void *component)
{
(void)component;
return (NULL);
}
const struct tag_component tag_component = {
base: {
name: "tag_component",
size: sizeof(struct tag_component),
dependencies: (char *[]){NULL},
ctr: &ctr,
fdctr: &fdctr,
dtr: &dtr,
serialize: &serialize,
destroy: &component_destroy
},
tag: NULL
};
-1
View File
@@ -7,7 +7,6 @@
#include <stdio.h> #include <stdio.h>
#include "xml.h" #include "xml.h"
#include "read_line.h"
#include "utility.h" #include "utility.h"
#include "entity.h" #include "entity.h"
#include "engine.h" #include "engine.h"
+2 -1
View File
@@ -44,6 +44,7 @@ int prefab_loadentities(node *n, gc_engine *engine, gc_scene *scene)
return (-1); return (-1);
scene->add_entity(scene, entity); scene->add_entity(scene, entity);
} }
if (engine->on_resize && engine->get_screen_size && engine->scene)
engine->on_resize(engine, engine->get_screen_size(engine));
return (0); return (0);
} }
+2 -1
View File
@@ -6,7 +6,6 @@
*/ */
#include "engine.h" #include "engine.h"
#include "system.h"
#include "components/movable_component.h" #include "components/movable_component.h"
#include "components/parallax_component.h" #include "components/parallax_component.h"
#include "components/fixed_to_cam_component.h" #include "components/fixed_to_cam_component.h"
@@ -21,6 +20,7 @@
#include "components/vertex_component.h" #include "components/vertex_component.h"
#include <stdlib.h> #include <stdlib.h>
#include "components/clickable_component.h" #include "components/clickable_component.h"
#include "components/tag_component.h"
#include "components/input_component.h" #include "components/input_component.h"
void engine_add_component(gc_engine *engine, const void *component) void engine_add_component(gc_engine *engine, const void *component)
@@ -47,4 +47,5 @@ void engine_add_buildin_components(gc_engine *engine)
engine->add_component(engine, &clickable_component); engine->add_component(engine, &clickable_component);
engine->add_component(engine, &vertex_component); engine->add_component(engine, &vertex_component);
engine->add_component(engine, &input_component); engine->add_component(engine, &input_component);
engine->add_component(engine, &tag_component);
} }
-1
View File
@@ -15,7 +15,6 @@
#include "systems/collision_system.h" #include "systems/collision_system.h"
#include "systems/camerafollow_system.h" #include "systems/camerafollow_system.h"
#include "sfml_renderer.h" #include "sfml_renderer.h"
#include <stdlib.h>
void engine_add_system(gc_engine *engine, const void *system) void engine_add_system(gc_engine *engine, const void *system)
{ {
+5 -1
View File
@@ -53,11 +53,15 @@ char *entity_serialize(gc_entity *entity, int fd)
return (NULL); return (NULL);
} }
static void destroy(gc_entity *entity) static void destroy(gc_entity *entity, gc_scene *scene)
{ {
gc_component *next = NULL; gc_component *next = NULL;
for (gc_component *cmp = entity->components; cmp; cmp = next) { for (gc_component *cmp = entity->components; cmp; cmp = next) {
for (gc_tupple *tup = scene->entities_by_cmp; tup; tup = tup->next)
if (!my_strcmp(tup->name, cmp->name))
tup_remove(tup, entity->id);
LISTREM(scene->entities, entity);
next = cmp->next; next = cmp->next;
cmp->destroy(cmp); cmp->destroy(cmp);
} }
+1 -1
View File
@@ -32,7 +32,7 @@ void scene_destroy(gc_scene *scene)
for (gc_list *entity = scene->entities; entity; entity = next) { for (gc_list *entity = scene->entities; entity; entity = next) {
next = entity->next; next = entity->next;
((gc_entity *)entity->data)->destroy(entity->data); ((gc_entity *)entity->data)->destroy(entity->data, scene);
free(entity); free(entity);
} }
free_data(scene); free_data(scene);
+4
View File
@@ -14,6 +14,7 @@
#include "systems/sfml_renderer_system.h" #include "systems/sfml_renderer_system.h"
#include "ui.h" #include "ui.h"
#include <malloc.h> #include <malloc.h>
#include "components/tag_component.h"
#include "components/input_component.h" #include "components/input_component.h"
gc_entity *background_from_text(gc_engine *engine, gc_scene *scene, node *n, \ gc_entity *background_from_text(gc_engine *engine, gc_scene *scene, node *n, \
@@ -58,6 +59,9 @@ gc_list *new_button(gc_engine *engine, gc_scene *scene, node *n)
background->add_component(background, new_component(&input_component)); background->add_component(background, new_component(&input_component));
background->add_component(background, new_component(&clickable_component, background->add_component(background, new_component(&clickable_component,
scene, xml_getproperty(n, "click"))); scene, xml_getproperty(n, "click")));
if (xml_hasproperty(n, "tag"))
background->add_component(background, new_component(&tag_component,
xml_getproperty(n, "tag")));
LISTADD(entities, background); LISTADD(entities, background);
LISTADD(entities, new_text(engine, scene, n)); LISTADD(entities, new_text(engine, scene, n));
return (entities); return (entities);
+17 -5
View File
@@ -8,9 +8,11 @@
#include "components/transform_component.h" #include "components/transform_component.h"
#include "components/renderer.h" #include "components/renderer.h"
#include "components/fixed_to_cam_component.h" #include "components/fixed_to_cam_component.h"
#include "components/tag_component.h"
#include "systems/sfml_renderer_system.h" #include "systems/sfml_renderer_system.h"
#include "ui.h" #include "ui.h"
#include <malloc.h> #include <malloc.h>
#include "prefab.h"
gc_entity *new_text(gc_engine *engine, gc_scene *scene, node *n) gc_entity *new_text(gc_engine *engine, gc_scene *scene, node *n)
{ {
@@ -21,11 +23,9 @@ gc_entity *new_text(gc_engine *engine, gc_scene *scene, node *n)
else else
entity = entity_create(); entity = entity_create();
entity->add_component(entity, new_component(&transform_component, entity->add_component(entity, new_component(&transform_component,
(gc_vector2){0, 0}, (gc_vector2){0, 0}, (gc_vector2){0, 0}));
(gc_vector2){0, 0}));
entity->add_component(entity, new_component(&renderer_component, entity->add_component(entity, new_component(&renderer_component,
GC_TXTREND, GC_TXTREND, xml_getproperty(n, "text"),
xml_getproperty(n, "text"),
scene->get_data(scene, "font", NULL), scene->get_data(scene, "font", NULL),
xml_getintprop(n, "size"), xml_getintprop(n, "size"),
xml_gettempprop(n, "color"), xml_getbool(n, "resize", true))); xml_gettempprop(n, "color"), xml_getbool(n, "resize", true)));
@@ -33,6 +33,9 @@ gc_entity *new_text(gc_engine *engine, gc_scene *scene, node *n)
(gc_vector2){xml_getintprop(n, "x"),xml_getintprop(n, "y")}, (gc_vector2){xml_getintprop(n, "x"),xml_getintprop(n, "y")},
xml_propcontains(n, "x", "%"), xml_propcontains(n, "y", "%"), xml_propcontains(n, "x", "%"), xml_propcontains(n, "y", "%"),
0, 0, false, false)); 0, 0, false, false));
if (xml_hasproperty(n, "tag"))
entity->add_component(entity, new_component(&tag_component,
xml_getproperty(n, "tag")));
return (entity); return (entity);
} }
@@ -52,6 +55,9 @@ gc_entity *new_sprite(gc_engine *engine, gc_scene *scene, node *n)
xml_propcontains(n, "x", "%"), xml_propcontains(n, "y", "%"), xml_propcontains(n, "x", "%"), xml_propcontains(n, "y", "%"),
xml_getintprop(n, "width"), xml_getintprop(n, "height"), xml_getintprop(n, "width"), xml_getintprop(n, "height"),
xml_propcontains(n, "width", "%"), xml_propcontains(n, "height", "%"))); xml_propcontains(n, "width", "%"), xml_propcontains(n, "height", "%")));
if (xml_hasproperty(n, "tag"))
entity->add_component(entity, new_component(&tag_component,
xml_getproperty(n, "tag")));
return (entity); return (entity);
} }
@@ -72,8 +78,14 @@ gc_data *text_make(gc_engine *engine, gc_scene *scene, node *n)
{ {
gc_list *list = NULL; gc_list *list = NULL;
gc_data *data = malloc(sizeof(*data)); gc_data *data = malloc(sizeof(*data));
gc_component *cmp;
gc_entity *txt = new_text(engine, scene, n);
LISTADD(list, new_text(engine, scene, n)); LISTADD(list, txt);
for (n = n->child; n; n = n->next) {
cmp = deserialize_component(engine, txt, scene, n);
txt->add_component(txt, cmp);
}
data->name = "text"; data->name = "text";
data->type = "ui"; data->type = "ui";
data->destroy = NULL; data->destroy = NULL;
+16
View File
@@ -26,4 +26,20 @@ gc_list *list_add(gc_list *list, void *obj)
list->data = obj; list->data = obj;
list->next = NULL; list->next = NULL;
return (listconst); return (listconst);
}
gc_list *list_remove(gc_list *list, void *obj)
{
gc_list *listconst = list;
if (!list)
return (NULL);
if (list->data == obj)
return (list->next);
while (list->next && list->next->data != obj)
list = list->next;
if (!list->next)
return (listconst);
list->next = list->next->next;
return (listconst);
} }