源战役客户端
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

214 lines
5.6 KiB

--圆形cd
CirCleCdView = CirCleCdView or BaseClass(BaseComponent)
local CirCleCdView = CirCleCdView
local math_ceil = math.ceil
local string_format = string.format
function CirCleCdView:__init(handle_wnd, callback, is_base_skill, skill_id, width, height, font_size)
self:InitData(callback, is_base_skill, skill_id, width, height, font_size)
self:CreateGameObject(UIType.CircleCd)
end
function CirCleCdView:InitData(callback, is_base_skill, skill_id, width, height, font_size)
self.callback = callback
self.is_base_skill = is_base_skill
self.skill_id = skill_id
self.width = width or 86
self.height = height or 86
self.font_size = font_size
self.is_light_guide = true --幻光新手引导
end
function CirCleCdView:LoadSuccess()
self.mask = self:GetChild("mask"):GetComponent("Image")
self.cdTimeText = self:GetChild("cdTimeText"):GetComponent("Text")
self:GetChild("mask").sizeDelta = Vector2(self.width,self.height)
self:InitEvent()
self:Show(0,0)
SkillManager:getInstance():AddCDItem(self.skill_id,self)
end
function CirCleCdView:InitEvent()
local function onStartCdHandler(skill_id,cdTime)
if self.skill_id == skill_id then
--幻光新手引导
if self.skill_id == 120001 and self.is_light_guide then
GlobalEventSystem:Fire(EventName.HIDE_LIGHT_EFFCT_ICON)
self.is_light_guide = false
end
self:Show(cdTime,0)
end
end
self.start_cd_id = SkillManager:getInstance():Bind(SkillManager.START_SKILL_CD,onStartCdHandler)
local function onLockCDHandler(lock)
if self.skill_id ~= SkillManager.JUMP_SKILL_ID then --不能控制跳跃的cd状态
if lock then
self:PauseCD()
else
self:ContinueCD()
end
end
end
self.lock_cd_id = SkillManager:getInstance():Bind(SkillManager.LOCK_CD,onLockCDHandler)
local function onRefreshCDHandler(list)
if not self:IsPlaying() then
return
end
for index,vo in pairs(list) do
if self.skill_id == vo.skill_id then
local left_cd_time = (vo.cd_time - TimeUtil:getServerTimeMs( )) / 1000
local skillVo = SkillManager:getInstance():getSkill(self.skill_id)
if skillVo ~= nil then
local real_cd_time = skillVo:getRealCD()
if real_cd_time > left_cd_time then
local cd_time = skillVo:getCd() / 1000
local last_time = cd_time - left_cd_time
skillVo:refreshCD(real_cd_time - left_cd_time)
self:Show(cd_time,last_time)
end
end
break
end
end
end
self.refresh_cd_id = SkillManager:getInstance():Bind(SkillManager.REFRESH_CD,onRefreshCDHandler)
end
function CirCleCdView:__defineVar()
return {
_class_type = self,
--_cid = self._id,
_iid = _in_obj_ins_id,
_use_delete_method = false,
skill_id = nil,
width = nil,
height = nil,
font_size = nil,
callback = nil,
all_time = 0,
last_time = 0,
curr_show_time = 0,
is_dead = false,
is_playing = false,
is_pause = false,
is_base_skill = false
}
end
function CirCleCdView:IsPlaying()
return self.is_playing
end
function CirCleCdView:SetSkillId(skill_id)
self:RemoveTimer()
self.cdTimeText.text = ""
self.mask.fillAmount = 0
self.skill_id = skill_id
SkillManager:getInstance():AddCDItem(self.skill_id,self)
local skillVo = SkillManager:getInstance():getSkill(self.skill_id)
if skillVo ~= nil then
local cdTime = skillVo:getRealCD()
if cdTime > 0 then
self:Show(cdTime,0)
end
end
-- local cdTime = 1
-- cdTime = skillVo:getCd()/1000
-- self:Show(cdTime,0)
-- end
end
function CirCleCdView:Show(all_time, last_time, skill_id)
self:RemoveTimer()
self.all_time = all_time
self.last_time = last_time or 0
self.curr_show_time = 0
self.skill_id = skill_id or self.skill_id
self.mask.color = Color(1,1,1,1)
self.cdTimeText.color = Color(1,1,1,1)
SkillManager:getInstance():AddCDItem(self.skill_id,self)
if self.all_time == 0 or self.last_time >= self.all_time then
self.cdTimeText.text = ""
self.mask.fillAmount = 0
return
end
if not self.is_base_skill then
local cur_percent = 1 - self.last_time / self.all_time
self.mask.fillAmount = cur_percent
local left_time = self.all_time - self.last_time - self.curr_show_time
if left_time > 1 then
self.cdTimeText.text = math_ceil(left_time)
else
self.cdTimeText.text = string_format("%.1f", left_time)
end
end
self:AddTimer()
end
function CirCleCdView:AddTimer()
Runner.Instance:AddRunObj(self, 3)
self.is_playing = true
end
function CirCleCdView:RemoveTimer()
Runner.Instance:RemoveRunObj(self)
self.is_playing = false
end
--暂停cd
function CirCleCdView:PauseCD()
self.is_pause = true
end
function CirCleCdView:ContinueCD()
self.is_pause = false
end
function CirCleCdView:Update(now_time, elapse_time)
if self.is_pause then return end
self.curr_show_time = elapse_time + self.curr_show_time
local cur_percent = 1 - (self.last_time + self.curr_show_time) / self.all_time
if cur_percent <= 0 then
cur_percent = 0
self:RemoveTimer()
self.cdTimeText.text = ""
self.mask.fillAmount = 0
if self.callback then
self.callback()
end
return
end
if not self.is_base_skill then
self.mask.fillAmount = cur_percent
local left_time = self.all_time - self.last_time - self.curr_show_time
if left_time > 1 then
self.cdTimeText.text = math_ceil(left_time)
else
self.cdTimeText.text = string_format("%.1f", left_time)
end
end
end
function CirCleCdView:__delete( )
self:RemoveTimer()
if self.start_cd_id then
SkillManager:getInstance():UnBind(self.start_cd_id)
self.start_cd_id = nil
end
if self.lock_cd_id then
SkillManager:getInstance():UnBind(self.lock_cd_id)
self.lock_cd_id = nil
end
if self.refresh_cd_id then
SkillManager:getInstance():UnBind(self.refresh_cd_id)
self.refresh_cd_id = nil
end
SkillManager:getInstance():RemoveCdItem(self.skill_id)
end