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
|