-- <* -- @Author: Saber -- @Description: 完成成就的弹出提示界面 -- *> AchieveTipsView = AchieveTipsView or BaseClass(BaseView) local AchieveTipsView = AchieveTipsView function AchieveTipsView:__init() self.base_file = "achievement" self.layout_file = "AchieveTipsView" self.layer_name = "Top" self.destroy_imm = true self.use_background = false --全屏界面默认使用这个参数 self.is_animating = false -- 是否在动画中 self.hide_time = 2 -- n秒后播放界面隐藏动画 self.btn_des = "领取" -- 按钮文本 self.left_time_des = "领取" -- 倒计时文本 self.awardItem_list = {} self.receive_flag = nil -- 读取完界面数据后,用于发送领取协议的关键键值 self.model = AchieveModel:getInstance() self.model.tip_view_show = true self.load_callback = function () self:LoadSuccess() self:AddEvent() end self.open_callback = function ( ) self:OpenSuccess() end self.destroy_callback = function ( ) self:DestroySuccess() end end function AchieveTipsView:Open(achv_data) self.achv_data = achv_data BaseView.Open(self) end --重用界面,5秒后再销毁 function AchieveTipsView:ResetViewInfo(achv_data) self.achv_data = achv_data self.transform.anchoredPosition = Vector2(-3.5, 61.5) self.receive_flag = nil self.gameObject:SetActive(true) if self.delay_closeview_id then TimerQuest.CancelQuest(GlobalTimerQuest,self.delay_closeview_id) self.delay_closeview_id = nil end self:UpdateView() -- 更新数据 self:StartCloseTimer() -- 开始对界面的关闭进行计时 self:OpenAnimation() -- 播放打开界面的动画 end function AchieveTipsView:LoadSuccess() local nodes = { -- 成就完成弹窗相关 "achieve_tip:obj", "achieve_tip/achi_award_con", -- 成就奖励容器 "achieve_tip/achi_receive_btn:obj", -- 成就领取按钮 "achieve_tip/achi_desc:tmp", "achieve_tip/achi_name:tmp", -- 成就信息 "achieve_tip/achi_receive_btn/receive_btn_des:tmp", -- 章节完成弹窗相关 "chapter_tip:obj", "chapter_tip/chapter_receive_btn:obj", -- 章节领取按钮 "chapter_tip/chapter_img:img", -- 章节相关立绘图 "chapter_tip/chapter_des:img", -- 章节称号容器 "chapter_tip/chapter_name:tmp", -- 章节名称 "chapter_tip/role_sp:raw", -- 立绘 "chapter_tip/chapter_receive_btn/chapter_btn_des:tmp", -- 其他 "close_timer:tmp", } self:GetChildren(nodes) self.canvasGroup = self.gameObject:GetComponent("CanvasGroup") self.transform.anchoredPosition = Vector2(-3.5, 61.5) end function AchieveTipsView:AddEvent() local function click_event(target) self:ReceiveAchieveFunc() self:ClearHideTimer() self:AutoCloseFunc() end AddClickEvent(self.achi_receive_btn_obj, click_event) AddClickEvent(self.chapter_receive_btn_obj, click_event) end function AchieveTipsView:OpenSuccess() self:UpdateView() self:StartCloseTimer() self:OpenAnimation() -- 播放打开界面的动画 end function AchieveTipsView:UpdateView() local cfg self.achieve_tip_obj:SetActive(not self.achv_data.is_chapter) self.chapter_tip_obj:SetActive(self.achv_data.is_chapter) if self.achv_data.is_chapter then -- 完成章节 cfg = Config.Achievementcategoryreward[self.achv_data.data.category] self.receive_flag = self.achv_data.data.category self.chapter_name_tmp.text = Trim(cfg.name) -- 加载称号资源 local designation = stringtotable(cfg.reward)[1][2] local designation_id = DesignationModel:GetInstance():GetDesignationIdByGoodsId(designation) lua_resM:setOutsideImageSprite(self, self.chapter_des_img, GameResPath.GetDesignImage(designation_id), true) -- 加载立绘资源 lua_resM:setOutsideRawImage(self, self.role_sp_raw, GameResPath.GetAchieveRoleSP("small" .. self.achv_data.data.category), true) else -- 完成成就 cfg = Config.Achievement[self.achv_data.data.category .. "@" .. self.achv_data.data.sub_category] self.receive_flag = {category = self.achv_data.data.category, sub_category = self.achv_data.data.sub_category} self.achi_name_tmp.text = string.format('第%s章 %s', WordManager:getHanZiNumber(self.achv_data.data.category), Trim(cfg.name)) self.achi_desc_tmp.text = Trim(cfg.desc) -- 加载奖励内容 local reward = stringtotable(cfg.reward) for k, v in ipairs(reward) do local item = self.awardItem_list[k] if not item then item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.achi_award_con) self.awardItem_list[k] = item end item:SetItemSize(62, 62) item:SetPosition(self.achi_award_con.sizeDelta.x/2 +((k-1) - #reward/2) * 75 + 5, -3) item:SetVisible(true) local typeId, lock = GoodsModel:getInstance():GetMappingTypeId(v[1], v[2]) item:SetData(typeId, v[3], nil, nil, lock) end if #reward < #self.awardItem_list then for i = #reward+1, #self.awardItem_list do self.awardItem_list[i]:SetVisible(false) end end end if self.model:CheckCanQuickGetReward() then self.btn_des = "领取" self.left_time_des = "领取" else self.btn_des = "前往" self.left_time_des = "关闭" end self.receive_btn_des_tmp.text = self.btn_des self.chapter_btn_des_tmp.text = self.btn_des end -- 开始界面关闭的倒计时 function AchieveTipsView:StartCloseTimer() SetAnchoredPositionY(self.close_timer, -16.5) self:ClearHideTimer() -- if self.achv_data.is_chapter then -- self.close_timer.anchoredPosition = Vector2(237.5, 17.5) -- self.finished.anchoredPosition = Vector2(-84, -19) -- else -- self.close_timer.anchoredPosition = Vector2(229.5, 13) -- self.finished.anchoredPosition = Vector2(-205, -19) -- end local end_time = self.hide_time + TimeUtil:getServerTime() local function hide_timer() local left_time = end_time - TimeUtil:getServerTime() self.close_timer_tmp.text = left_time >= 0 and string.format("(%ss后自动%s)", ColorUtil.GREEN_DARK, math.ceil(left_time+1), self.left_time_des) or "" if left_time < 0 then self:ClearHideTimer() self:AutoCloseFunc() -- self:TimeOverReceiveAchieveFunc() -- 策划说不用自动前往了 end end hide_timer() self.hide_timer_id = GlobalTimerQuest:AddPeriodQuest(hide_timer, 0.1, -1) -- 设置动画标志量 self.is_animating = true end -- 点击按钮后的响应 function AchieveTipsView:ReceiveAchieveFunc( ) if not self.receive_flag then return end if self.model:CheckCanQuickGetReward() then -- 快捷领取 if type(self.receive_flag) == "table" then -- 表格式,说明是成就奖励 self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40903, self.receive_flag.category, self.receive_flag.sub_category) else -- 否则则是章节奖励的category self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40901, self.receive_flag) end else -- 直接跳转 self:OpenAchieveView() end end -- 倒计时结束的响应 function AchieveTipsView:TimeOverReceiveAchieveFunc( ) if not self.receive_flag then return end if self.model:CheckCanQuickGetReward() then -- 快捷领取 if type(self.receive_flag) == "table" then -- 表格式,说明是成就奖励 self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40903, self.receive_flag.category, self.receive_flag.sub_category) else -- 否则则是章节奖励的category self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40901, self.receive_flag) end else -- 直接关闭 end end function AchieveTipsView:ClearHideTimer( ) if self.hide_timer_id then GlobalTimerQuest:CancelQuest(self.hide_timer_id) self.hide_timer_id = nil end end function AchieveTipsView:AutoCloseFunc( ) local function callback() self:ClearHideTimer() self.gameObject:SetActive(false) local function delay_closeview( ) BaseView.Close(self) end self.delay_closeview_id = setTimeout(delay_closeview, 5) -- 设置动画标志量 self.is_animating = false -- 查看是否有称号还没展示完成界面 self.model:Fire(AchieveModel.OPEN_ACHIEVE_TIPS_VIEW, true) end self:CloseAnimation(callback) end -- 跳转到成就界面指定章节 function AchieveTipsView:OpenAchieveView( ) local category = self.achv_data.data.category end -- 播放打开界面的动画 function AchieveTipsView:OpenAnimation() self.canvasGroup.alpha = 0 if self.alpha_anim_id then TweenLite.Stop(self.alpha_anim_id) self.alpha_anim_id = nil end self.alpha_anim_id = TweenLite.to(self, self.canvasGroup, TweenLite.UiAnimationType.ALPHA, 1, 0.2) end -- 关闭(隐藏)界面的动画 function AchieveTipsView:CloseAnimation(callback) self.canvasGroup.alpha = 1 if self.alpha_anim_id then TweenLite.Stop(self.alpha_anim_id) self.alpha_anim_id = nil end self.alpha_anim_id = TweenLite.to(self, self.canvasGroup,TweenLite.UiAnimationType.ALPHA, 0, 0.5) local pos_y = self.transform.anchoredPosition.y + 100 if self.pos_id then TweenLite.Stop(self.pos_id) self.pos_id = nil end self.pos_id = TweenLite.to(self, self.transform, TweenLite.UiAnimationType.ANCHORED_POSY, pos_y, 0.5, callback) end function AchieveTipsView:DestroySuccess( ) self.model.tip_view_show = false self:ClearHideTimer() if self.delay_closeview_id then TimerQuest.CancelQuest(GlobalTimerQuest,self.delay_closeview_id) self.delay_closeview_id = nil end if self.alpha_anim_id then TweenLite.Stop(self.alpha_anim_id) self.alpha_anim_id = nil end if self.pos_id then TweenLite.Stop(self.pos_id) self.pos_id = nil end for i,item in pairs(self.awardItem_list) do UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, item) end self.awardItem_list = {} end