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