mirror of
https://github.com/zoriya/Gamacon.git
synced 2026-05-31 19:00:40 +00:00
Displaying the player at the middle of the tile
This commit is contained in:
@@ -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 *);
|
||||
};
|
||||
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, \
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user