|
|
- 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
|