diff --git a/Makefile b/Makefile index fd00872..4148d71 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,9 @@ SRC = src/engine/engine.c \ src/utility/tostr.c \ src/utility/atoi.c \ src/utility/my_strchr.c \ - src/utility/intparser.c \ + src/utility/parsers/intparser.c \ + src/utility/parsers/floatparser.c \ + src/utility/parsers/stringparser.c \ src/utility/my_strcmp.c \ src/utility/pow.c \ src/utility/read_line.c \ diff --git a/include/components/texture_renderer.h b/include/components/texture_renderer.h index 608c7db..419ee24 100644 --- a/include/components/texture_renderer.h +++ b/include/components/texture_renderer.h @@ -9,11 +9,13 @@ #include "component.h" #include "texture.h" +#include "vector2.h" struct texture_renderer { gc_component base; gc_texture *texture; + gc_vector2 scale; }; extern const struct texture_renderer texture_renderer; \ No newline at end of file diff --git a/include/engine.h b/include/engine.h index 2ae9536..c5bb87d 100644 --- a/include/engine.h +++ b/include/engine.h @@ -20,7 +20,7 @@ struct gc_engine bool (*is_open)(gc_engine *engine); int (*game_loop)(gc_engine *engine); int (*change_scene)(gc_engine *engine, gc_scene *scene); - void (*draw_texture)(gc_engine *, gc_texture *, gc_vector2); + void (*draw_texture)(gc_engine *, gc_texture *, gc_vector2, gc_vector2); sfRenderWindow *window; sfSprite *sprite; diff --git a/include/renderer.h b/include/renderer.h index a27e1e2..b8950e5 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -11,4 +11,4 @@ void renderer_draw(gc_engine *engine); gc_texture *texture_create(const char *path); -void renderer_draw_texture(gc_engine *engine, gc_texture *text, gc_vector2 pos); \ No newline at end of file +void renderer_draw_texture(gc_engine *, gc_texture *, gc_vector2, gc_vector2); \ No newline at end of file diff --git a/include/utility.h b/include/utility.h index 3e9352e..e1fd756 100644 --- a/include/utility.h +++ b/include/utility.h @@ -15,5 +15,7 @@ int my_atoi(const char *str); int my_strcmp(const char *str1, const char *str2); int my_strncmp(const char *str1, const char *str2, int n); char *my_strchr(const char *str, char c); -int parse_int(char **str); +int parse_arg_int(char **str); +float parse_arg_float(char **str); +char *parse_arg_str(char **str); int my_pow(int nb, int p); \ No newline at end of file diff --git a/src/components/movable_component.c b/src/components/movable_component.c index 4d48693..b22f16b 100644 --- a/src/components/movable_component.c +++ b/src/components/movable_component.c @@ -23,9 +23,9 @@ static void movable_fdctr(gc_engine *engine, void *component, char *args) { struct movable_component *cmp = (struct movable_component *)component; - cmp->left_key = parse_int(&args); - cmp->right_key = parse_int(&args); - cmp->jump_key = parse_int(&args); + cmp->left_key = parse_arg_int(&args); + cmp->right_key = parse_arg_int(&args); + cmp->jump_key = parse_arg_int(&args); (void)engine; } diff --git a/src/components/position_component.c b/src/components/position_component.c index 4b07c3c..3486398 100644 --- a/src/components/position_component.c +++ b/src/components/position_component.c @@ -21,8 +21,8 @@ void position_fdctr(gc_engine *engine, void *component, char *args) { struct position_component *cmp = (struct position_component *)component; - cmp->position.x = parse_int(&args); - cmp->position.y = parse_int(&args); + cmp->position.x = parse_arg_int(&args); + cmp->position.y = parse_arg_int(&args); (void)engine; } diff --git a/src/components/texture_renderer.c b/src/components/texture_renderer.c index fcddc38..b4f5683 100644 --- a/src/components/texture_renderer.c +++ b/src/components/texture_renderer.c @@ -6,6 +6,7 @@ */ #include "engine.h" +#include "utility.h" #include "components/position_component.h" #include "components/texture_renderer.h" @@ -14,13 +15,17 @@ static void texture_rend_ctr(void *component, va_list args) struct texture_renderer *cmp = (struct texture_renderer *)component; cmp->texture = va_arg(args, gc_texture *); + cmp->scale.x = va_arg(args, double); + cmp->scale.y = va_arg(args, double); } static void texture_rend_fdctr(gc_engine *engine, void *component, char *args) { struct texture_renderer *cmp = (struct texture_renderer *)component; - cmp->texture = get_texture(engine, args); + cmp->texture = get_texture(engine, parse_arg_str(&args)); + cmp->scale.x = parse_arg_float(&args); + cmp->scale.y = parse_arg_float(&args); } static void texture_rend_dtr(void *component) @@ -48,4 +53,5 @@ const struct texture_renderer texture_renderer = { prev: NULL }, texture: NULL, + scale: {0, 0} }; \ No newline at end of file diff --git a/src/deserializer/prefab.c b/src/deserializer/prefab.c index 72213fc..4f3c8b2 100644 --- a/src/deserializer/prefab.c +++ b/src/deserializer/prefab.c @@ -16,6 +16,8 @@ gc_entity *prefab_load(gc_engine *engine, const char *path) gc_entity *entity; int fd = open(path, O_RDONLY); + if (fd == -1) + return (NULL); entity = deserialize_entity(engine, fd); close(fd); return (entity); diff --git a/src/renderer/renderer.c b/src/renderer/renderer.c index 012953a..659c280 100644 --- a/src/renderer/renderer.c +++ b/src/renderer/renderer.c @@ -9,12 +9,14 @@ #include -void renderer_draw_texture(gc_engine *engine, gc_texture *text, gc_vector2 pos) +void renderer_draw_texture(gc_engine *engine, gc_texture *text, \ +gc_vector2 pos, gc_vector2 scale) { if (!text) return; sfSprite_setTexture(engine->sprite, text->texture, true); sfSprite_setPosition(engine->sprite, (sfVector2f){pos.x, pos.y}); + sfSprite_setScale(engine->sprite, (sfVector2f){scale.x, scale.y}); sfRenderWindow_drawSprite(engine->window, engine->sprite, NULL); } diff --git a/src/scene/scene.c b/src/scene/scene.c index 586b763..3e7cc03 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -32,14 +32,16 @@ int scene_add_entity(gc_scene *scene, gc_entity *entity) int scene_load_textures(gc_scene *scene, const char **textures) { gc_texture *texture; + int len = arraylen(textures) + 1; - scene->textures = malloc(sizeof(gc_texture) * (arraylen(textures))); + scene->textures = malloc(sizeof(gc_texture) * len); for (int i = 0; textures[i]; i++) { texture = texture_create(textures[i]); if (!texture) return (-1); scene->textures[i] = texture; } + scene->textures[len - 1] = NULL; return (0); } @@ -49,7 +51,8 @@ gc_scene *scene_create(const char **textures) if (!scene) return (NULL); - if (scene_load_textures(scene, textures) < 0) + scene->textures = NULL; + if (textures && scene_load_textures(scene, textures) < 0) return (NULL); scene->entities = NULL; scene->add_entity = &scene_add_entity; diff --git a/src/systems/texture_renderer_system.c b/src/systems/texture_renderer_system.c index f245809..e5abbe1 100644 --- a/src/systems/texture_renderer_system.c +++ b/src/systems/texture_renderer_system.c @@ -20,7 +20,7 @@ void tex_rend_update_entity(gc_engine *engine, gc_entity *entity) struct texture_renderer *text = (\ struct texture_renderer *)entity->get_component(entity, "TextureRenderer"); - engine->draw_texture(engine, text->texture, pos->position); + engine->draw_texture(engine, text->texture, pos->position, text->scale); } const gc_system texture_renderer_system = { diff --git a/src/utility/parsers/floatparser.c b/src/utility/parsers/floatparser.c new file mode 100644 index 0000000..6b97ce5 --- /dev/null +++ b/src/utility/parsers/floatparser.c @@ -0,0 +1,32 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** floatparser +*/ + +#include "utility.h" + +int get_int_size(int n) +{ + int base_size = my_strlen("0123456789"); + int i = 1; + + while (n >= base_size) { + n /= base_size; + i++; + } + return (i); +} + +float parse_arg_float(char **str) +{ + int i = parse_arg_int(str); + int decimal = 0; + + if ((*str)[-1] == '.') { + decimal = parse_arg_int(str); + return i + ((float)decimal / (get_int_size(decimal) * 10)); + } + return ((float)i); +} \ No newline at end of file diff --git a/src/utility/intparser.c b/src/utility/parsers/intparser.c similarity index 97% rename from src/utility/intparser.c rename to src/utility/parsers/intparser.c index a7f1c19..5eca03c 100644 --- a/src/utility/intparser.c +++ b/src/utility/parsers/intparser.c @@ -34,7 +34,7 @@ int parse_end(char **str, int strlen, int start, int mult) return (nbr); } -int parse_int(char **str) +int parse_arg_int(char **str) { int strlen = 0; int start = -1; diff --git a/src/utility/parsers/stringparser.c b/src/utility/parsers/stringparser.c new file mode 100644 index 0000000..1822b92 --- /dev/null +++ b/src/utility/parsers/stringparser.c @@ -0,0 +1,20 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** stringparser +*/ + +#include "utility.h" + +char *parse_arg_str(char **str) +{ + char *p = my_strchr(*str, ' '); + char *tmp = *str; + + if (!p) + return (*str); + *p = '\0'; + *str = p + 1; + return (tmp); +} \ No newline at end of file