Updating position of entities linked to tiles

This commit is contained in:
Anonymus Raccoon
2020-03-31 14:47:18 +02:00
parent aab92b33e4
commit acb03f59e7
7 changed files with 85 additions and 15 deletions
+1
View File
@@ -48,6 +48,7 @@ SRC = src/engine/engine.c \
src/systems/tooltip_system.c \
src/systems/clickable_system.c \
src/systems/fixed_to_cam_pseudosystem.c \
src/systems/map_linker_system.c \
src/engine/engine_system_builder.c \
src/engine/engine_component_builder.c \
src/engine/event_manager.c \
+10 -1
View File
@@ -11,6 +11,15 @@
#include "component.h"
const gc_component map_linker;
struct map_linker
{
gc_component base;
struct tile *tile;
};
const struct map_linker map_linker;
void map_linker_update_entity(gc_engine *engine, gc_entity *entity, \
struct tile *tile, gc_vector2 map_offset);
#endif //MY_RPG_MAP_LINKER_H
+3
View File
@@ -10,8 +10,11 @@
#include <stdbool.h>
#include "components/vertex_component.h"
#include "systems/sfml_renderer_system.h"
bool get_vertices(struct vertex_component *this, node *n);
bool get_tiles(struct vertex_component *this, gc_scene *scene, node *n);
void isometry_update_entity(struct sfml_renderer_system *this, \
gc_entity *entity, gc_engine *engine, float dt);
#endif //MY3D_CREATE_MAP_FUNCTIONS_H
+36 -12
View File
@@ -5,15 +5,37 @@
** map_linker.c
*/
#include <components/renderer.h>
#include "components/renderer.h"
#include "component.h"
#include "components/vertex_component.h"
#include "components/map_linker.h"
#include "map_utils.h"
#include "my.h"
static void ctr(void *component, va_list args)
{
gc_entity *entity = va_arg(args, gc_entity *);
gc_scene *scene = va_arg(args, gc_scene *);
gc_list *maps;
struct vertex_component *vert;
int x = va_arg(args, int);
int y = va_arg(args, int);
struct tile *tile;
struct renderer *rend;
if (!scene || !(maps = scene->get_entity_by_cmp(scene, "vertex_component")))
return;
vert = GETCMP(maps->data, vertex_component);
tile = get_tile_at(vert, (gc_vector2i){x, y});
if (!tile) {
my_printf("No tile found at %d, %d. Can't link entity to it.\n", x, y);
return;
}
tile->entity = entity;
rend = GETCMP(entity, renderer);
if (rend)
rend->is_visible = false;
}
static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
@@ -50,15 +72,17 @@ static char *serialize(void *component)
return (NULL);
}
const gc_component map_linker = {
name: "map_linker",
size: sizeof(gc_component),
dependencies: (char *[]) {
NULL
},
ctr: &ctr,
fdctr: &fdctr,
dtr: &dtr,
serialize: &serialize,
destroy: &component_destroy
const struct map_linker map_linker = {
base: {
name: "map_linker",
size: sizeof(struct map_linker),
dependencies: (char *[]) {
NULL
},
ctr: &ctr,
fdctr: &fdctr,
dtr: &dtr,
serialize: &serialize,
destroy: &component_destroy
}
};
+1 -1
View File
@@ -53,7 +53,7 @@ gc_sprite *sprite, float dt)
sprite->rect.width, sprite->rect.height
});
sfSprite_setPosition(rend->sprite, pos);
sfmlrenderer_setorigin(rend, entity, sprite, tra);
sfmlrenderer_setorigin(rend, entity, sprite, tra);
sfRenderWindow_drawSprite(rend->window, rend->sprite, NULL);
}
+6 -1
View File
@@ -12,7 +12,9 @@
#include "map_utils.h"
#include <stdint.h>
#include <SFML/Graphics.h>
#include <components/renderer.h>
#include "isometry.h"
#include "components/map_linker.h"
#include "components/renderer.h"
static void tile_rotate(struct tile *tile, int *vertex_order)
{
@@ -56,7 +58,10 @@ gc_vector2 offset, struct tile *tile, float dt)
sfRenderWindow_drawVertexArray(this->window, this->vertices, this->states);
this->states->texture = NULL;
if (tile->entity) {
map_linker_update_entity(engine, tile->entity, tile, offset);
renderer = GETCMP(tile->entity, renderer);
if (!renderer)
return;
renderer->is_visible = true;
this->system.update_entity(engine, this, tile->entity, dt);
renderer->is_visible = false;
+28
View File
@@ -0,0 +1,28 @@
/*
** EPITECH PROJECT, 2020
** my_rpg
** File description:
** map_linker_system.c
*/
#include <components/map_linker.h>
#include "system.h"
#include "map_utils.h"
#include "components/transform_component.h"
void map_linker_update_entity(gc_engine *engine, gc_entity *entity, \
struct tile *tile, gc_vector2 map_offset)
{
struct map_linker *link = GETCMP(entity, map_linker);
struct transform_component *tra = GETCMP(entity, transform_component);
struct vertex *c = tile->corners[0];
if (!link)
return;
link->tile = tile;
if (!tra)
return;
tra->position = gc_vector2_from_coords(c->x, c->y, c->z);
tra->position.x += map_offset.x;
tra->position.y += map_offset.y;
}