BesselAnimManager = BesselAnimManager or BaseClass() function BesselAnimManager:__init() BesselAnimManager.Instance = self -- obj = { -- start_pos -- key_pos -- end_pos -- start_time -- total_time -- update_func -- } self.obj_list = {} self.obj_index = 1 Runner.Instance:AddRunObj(self, 3) end function BesselAnimManager:getInstance() if BesselAnimManager.Instance==nil then BesselAnimManager.New() end return BesselAnimManager.Instance end function BesselAnimManager:__delete() for id, obj in pairs(self.obj_list) do obj.update_func(1, obj.end_pos) end self.obj_list = {} end --[[ /** *创建贝赛尔曲线动画,动画结束后会自动移除,不需要手动Remove * @param start_pos 起点 * @param end_pos 终点 * @param total_time 动画时长 * @param update_func 每帧回调的函数,参数(p, pos) * @param key_p 关键点在起点终点连线上的投影的位置,0表示在起点处,1表示在终点处,但是可为负或大于1 * @param key_dist 关键点到起点终点连线的距离,可有正负,表示在连线的两侧 */ ]] function BesselAnimManager:AddBesselAnimNoKey(start_pos, end_pos, total_time, update_func, key_p, key_dist) key_p = key_p or 0.5 key_dist = key_dist or (Vector2.Magnitude((start_pos - end_pos)) / 3) local key_pos = GameMath.GetVerticlePoint(start_pos, end_pos, key_p, key_dist) return self:AddBesselAnimWithKey(start_pos, key_pos, end_pos, total_time, update_func) end --[[ /** *创建贝赛尔曲线动画,动画结束后会自动移除,不需要手动Remove * @param start_pos 起点 * @param key_pos 关键点 * @param end_pos 终点 * @param total_time 动画时长 * @param update_func 每帧回调的函数,参数(p, pos) */ ]] function BesselAnimManager:AddBesselAnimWithKey(start_pos, key_pos, end_pos, total_time, update_func) local obj = { start_pos = start_pos, key_pos = key_pos, end_pos = end_pos, start_time = Status.NowTime, total_time = total_time, update_func = update_func } self.obj_list[self.obj_index] = obj self.obj_index = self.obj_index + 1 return self.obj_index - 1 end function BesselAnimManager:Update(now_time, elapsed_time) for id, obj in pairs(self.obj_list) do local p = (now_time - obj.start_time) / obj.total_time if p > 1 then obj.update_func(p, obj.end_pos) self.obj_list[id] = nil else local posx,pos_y = ParticleBessel.GetCurvePoint(obj.start_pos, obj.key_pos, obj.end_pos, p) obj.update_func(p, posx, pos_y) end end end