源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

87 lines
2.5 KiB

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