Incorporate anchor point in player sprite info

Changelog:
- src anchorpoint is also an enum. The offset needs to be computed
  dynamically due to flip_x
- Re-add back the offset field.
- Add symbol parsing for anchor point.
main
En Yi 2024-08-06 21:36:17 +08:00
parent 1215746e05
commit 4a54bfe84f
3 changed files with 37 additions and 9 deletions

View File

@ -209,7 +209,7 @@ typedef struct _SpriteRenderInfo
{ {
Sprite_t* sprite; Sprite_t* sprite;
Vector2 offset; Vector2 offset;
Vector2 src_anchor; AnchorPoint_t src_anchor;
AnchorPoint_t dest_anchor; AnchorPoint_t dest_anchor;
} SpriteRenderInfo_t; } SpriteRenderInfo_t;

View File

@ -440,7 +440,10 @@ static void render_editor_game_scene(Scene_t* scene)
pos, pos,
get_anchor_offset(p_bbox->size, spr.dest_anchor, p_cspr->flip_x) get_anchor_offset(p_bbox->size, spr.dest_anchor, p_cspr->flip_x)
); );
pos = Vector2Subtract(pos, spr.src_anchor); pos = Vector2Subtract(
pos,
get_anchor_offset(spr.sprite->frame_size, spr.src_anchor, p_cspr->flip_x)
);
} }
Vector2 offset = spr.offset; Vector2 offset = spr.offset;

View File

@ -136,6 +136,30 @@ Entity_t* create_dead_player(EntityManager_t* ent_manager)
return p_ent; return p_ent;
} }
static AnchorPoint_t parse_anchor_symbol(const char symbol[2])
{
if (symbol[0] == 't')
{
if (symbol[1] == 'l') return AP_TOP_LEFT;
if (symbol[1] == 'c') return AP_TOP_CENTER;
if (symbol[1] == 'r') return AP_TOP_RIGHT;
}
else if (symbol[0] == 'm')
{
if (symbol[1] == 'l') return AP_MID_LEFT;
if (symbol[1] == 'c') return AP_MID_CENTER;
if (symbol[1] == 'r') return AP_MID_RIGHT;
}
else if (symbol[0] == 'b')
{
if (symbol[1] == 'l') return AP_BOT_LEFT;
if (symbol[1] == 'c') return AP_BOT_CENTER;
if (symbol[1] == 'r') return AP_BOT_RIGHT;
}
return AP_TOP_LEFT;
}
static bool init_player_file(FILE* in_file, Assets_t* assets) static bool init_player_file(FILE* in_file, Assets_t* assets)
{ {
static bool already_init = false; static bool already_init = false;
@ -162,11 +186,13 @@ static bool init_player_file(FILE* in_file, Assets_t* assets)
while(*info_str == ' ' || *info_str == '\t') info_str++; while(*info_str == ' ' || *info_str == '\t') info_str++;
Vector2 offset; Vector2 offset;
char src_ap_symbol[3];
char dest_ap_symbol[3];
int data_count = sscanf( int data_count = sscanf(
info_str, "%f,%f", info_str, "%f,%f,%2s,%2s",
&offset.x, &offset.y &offset.x, &offset.y, src_ap_symbol, dest_ap_symbol
); );
if (data_count !=2) if (data_count != 4)
{ {
printf("Unable to parse info for player at line %lu\n", line_num); printf("Unable to parse info for player at line %lu\n", line_num);
return false; return false;
@ -174,10 +200,9 @@ static bool init_player_file(FILE* in_file, Assets_t* assets)
Sprite_t* spr = get_sprite(assets, name); Sprite_t* spr = get_sprite(assets, name);
spr->anchor = Vector2Scale(spr->frame_size, 0.5f); spr->anchor = Vector2Scale(spr->frame_size, 0.5f);
player_sprite_map[i].sprite = spr; player_sprite_map[i].sprite = spr;
//player_sprite_map[i].offset = offset; player_sprite_map[i].offset = offset;
player_sprite_map[i].offset = (Vector2){0}; player_sprite_map[i].src_anchor = parse_anchor_symbol(src_ap_symbol);
player_sprite_map[i].src_anchor = get_anchor_offset(spr->frame_size, AP_BOT_CENTER, false); player_sprite_map[i].dest_anchor = parse_anchor_symbol(dest_ap_symbol);
player_sprite_map[i].dest_anchor = AP_BOT_CENTER;
i++; i++;
} }
already_init = true; already_init = true;