Displaying the player at the middle of the tile

This commit is contained in:
Anonymus Raccoon
2020-03-31 17:47:23 +02:00
parent acb03f59e7
commit 25aaad98ed
6 changed files with 40 additions and 40 deletions
+2
View File
@@ -24,6 +24,8 @@ struct renderer
enum gc_texturetype type;
void *data;
bool is_visible;
bool is_centered_x;
bool is_centered_y;
void (*destroy)(struct renderer *);
};
+1
View File
@@ -11,6 +11,7 @@
#define ANGLE_X 25
#define ANGLE_Y 35
#define TILE_SIZE 64
struct tile *get_tile_from_pos(struct vertex_component *map, gc_vector2 pos);
struct tile *get_tile_at(struct vertex_component *v, gc_vector2i p);
+19 -22
View File
@@ -13,6 +13,23 @@
#include "my.h"
static void init(gc_entity *entity, struct vertex_component *vert, int x, int y)
{
struct renderer *rend;
struct tile *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;
rend->is_centered_x = true;
}
}
static void ctr(void *component, va_list args)
{
gc_entity *entity = va_arg(args, gc_entity *);
@@ -21,21 +38,11 @@ static void ctr(void *component, va_list args)
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;
init(entity, vert, x, y);
}
static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
@@ -44,21 +51,11 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
struct vertex_component *vert;
int x = xml_getintprop(n, "x");
int y = xml_getintprop(n, "y");
struct tile *tile;
struct renderer *rend;
if (!maps)
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;
init(entity, vert, x, y);
}
static void dtr(void *component)
+4 -5
View File
@@ -7,12 +7,9 @@
#include "engine.h"
#include "xml.h"
#include "utility.h"
#include "sprite.h"
#include "text.h"
#include "components/transform_component.h"
#include "components/renderer.h"
#include <stdlib.h>
#include <stdbool.h>
#include <stddef.h>
static void ctr(void *component, va_list args)
{
@@ -23,6 +20,8 @@ static void ctr(void *component, va_list args)
cmp->data = NULL;
cmp->type = type;
cmp->is_visible = true;
cmp->is_centered_x = false;
cmp->is_centered_y = false;
if (type == GC_TEXTUREREND)
sprite_ctr(cmp, args);
if (type == GC_ANIMREND)
+12 -10
View File
@@ -10,6 +10,7 @@
#include "sprite.h"
#include "text.h"
#include "components/transform_component.h"
#include "components/renderer.h"
#include "systems/sfml_renderer_system.h"
#include "my.h"
#include <SFML/Graphics.h>
@@ -21,18 +22,19 @@ gc_entity *entity, gc_sprite *sprite, struct transform_component *tra)
tra->size.x * sprite->scale.x / sprite->rect.width,
tra->size.y * sprite->scale.y / sprite->rect.height
};
struct renderer *rend = GETCMP(entity, renderer);
int ori_x = scale.x < 0 ? sprite->rect.width : 0;
int ori_y = scale.y < 0 ? sprite->rect.height : 0;
sfSprite_setScale(renderer->sprite, scale);
if (entity->has_component(entity, "fixed_to_cam"))
sfSprite_setOrigin(renderer->sprite, (sfVector2f) {
sprite->rect.width / 2,
sprite->rect.height / 2
});
else
sfSprite_setOrigin(renderer->sprite, (sfVector2f){
scale.x < 0 ? sprite->rect.width : 0,
scale.y < 0 ? sprite->rect.height : 0
});
ori_x = rend->is_centered_x ? sprite->rect.width / 2 : ori_x;
ori_y = rend->is_centered_y ? sprite->rect.height / 2 : ori_y;
if (entity->has_component(entity, "fixed_to_cam")) {
ori_x = sprite->rect.width / 2;
ori_y = sprite->rect.height / 2;
}
sfSprite_setOrigin(renderer->sprite, (sfVector2f){ori_x, ori_y});
}
void sfmlrenderer_draw_texture(gc_engine *engine, gc_entity *entity, \
+2 -3
View File
@@ -11,8 +11,7 @@
#include "components/transform_component.h"
void map_linker_update_entity(gc_engine *engine, gc_entity *entity, \
struct tile *tile, gc_vector2 map_offset)
{
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];
@@ -22,7 +21,7 @@ struct tile *tile, gc_vector2 map_offset)
link->tile = tile;
if (!tra)
return;
tra->position = gc_vector2_from_coords(c->x, c->y, c->z);
tra->position = gc_vector2_from_coords(c->x - 0.5, c->y - 0.5, c->z);
tra->position.x += map_offset.x;
tra->position.y += map_offset.y;
}