diff --git a/engine/EC.h b/engine/EC.h index 67a3b67..8964b27 100644 --- a/engine/EC.h +++ b/engine/EC.h @@ -209,7 +209,7 @@ typedef struct _SpriteRenderInfo { Sprite_t* sprite; Vector2 offset; - Vector2 src_anchor; + AnchorPoint_t src_anchor; AnchorPoint_t dest_anchor; } SpriteRenderInfo_t; diff --git a/scenes/editor_scene.c b/scenes/editor_scene.c index b8d82ac..8df4d50 100644 --- a/scenes/editor_scene.c +++ b/scenes/editor_scene.c @@ -440,7 +440,10 @@ static void render_editor_game_scene(Scene_t* scene) pos, 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; diff --git a/scenes/player_ent.c b/scenes/player_ent.c index 7f61446..47506b2 100644 --- a/scenes/player_ent.c +++ b/scenes/player_ent.c @@ -136,6 +136,30 @@ Entity_t* create_dead_player(EntityManager_t* ent_manager) 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 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++; Vector2 offset; + char src_ap_symbol[3]; + char dest_ap_symbol[3]; int data_count = sscanf( - info_str, "%f,%f", - &offset.x, &offset.y + info_str, "%f,%f,%2s,%2s", + &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); return false; @@ -174,10 +200,9 @@ static bool init_player_file(FILE* in_file, Assets_t* assets) Sprite_t* spr = get_sprite(assets, name); spr->anchor = Vector2Scale(spr->frame_size, 0.5f); player_sprite_map[i].sprite = spr; - //player_sprite_map[i].offset = offset; - player_sprite_map[i].offset = (Vector2){0}; - player_sprite_map[i].src_anchor = get_anchor_offset(spr->frame_size, AP_BOT_CENTER, false); - player_sprite_map[i].dest_anchor = AP_BOT_CENTER; + player_sprite_map[i].offset = offset; + player_sprite_map[i].src_anchor = parse_anchor_symbol(src_ap_symbol); + player_sprite_map[i].dest_anchor = parse_anchor_symbol(dest_ap_symbol); i++; } already_init = true;