int lsprite_set_anim(lua_State* L) { struct sprite* self = (struct sprite*)lua_touserdata(L, 1); luaL_checktype(L, 2, LUA_TTABLE); int len = luaL_len(L, 2); struct array* frames = array_new(len); for (int i = 1; i <= len; ++i) { lua_rawgeti(L, -1, i); struct sprite_frame* frame = lua_touserdata(L, -1); array_push_back(frames, frame); lua_pop(L, 1); } struct anim* anim = anim_new(frames); sprite_set_anim(self, anim); array_free(frames); return 0; }
void player_update_animation(player_t *player, game_t *game){ player->sprite->step += 1; if(player->body->flags & BLOCKED_D){ if(player->move_dir == DIR_X){ if(player->face_dir == DIR_R){ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_idle_r")); }else if(player->face_dir == DIR_L){ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_idle_l")); } }else if(player->move_dir == DIR_R){ if(player->ctrl_dir == DIR_R){ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_move_r")); }else{ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_skid_r")); } }else if(player->move_dir == DIR_L){ if(player->ctrl_dir == DIR_L){ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_move_l")); }else{ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_skid_l")); } } }else{ if(player->face_dir == DIR_R){ if(player->body->vy < -1.0){ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_jump_r")); }else if(player->body->vy > 1.0){ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_fall_r")); }else{ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_hang_r")); } }else if(player->face_dir == DIR_L){ if(player->body->vy < -1.0){ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_jump_l")); }else if(player->body->vy > 1.0){ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_fall_l")); }else{ sprite_set_anim(player->sprite, anim_dict_get(game->anims, "generic_hang_l")); } } } }