-- <* -- @Author: Saber -- @Description: 成就总览界面 -- *> AchieveTotalView = AchieveTotalView or BaseClass(BaseItem) local AchieveTotalView = AchieveTotalView function AchieveTotalView:__init(parent_wnd,prefab_asset,layer_name) self.base_file = "achievement" self.layout_file = "AchieveTotalView" self.parent_wnd = parent_wnd self.layer_name = layer_name self.cur_attr_item = {} -- 当前成就等级属性节点 self.next_attr_item = {} -- 下一级成就等级属性节点 self.privilege_item = {} -- 成就特权item列表 self.achieve_lv_data = nil -- 成就等级数据 self.cur_achieve_lv = -1 -- 当前成就等级 self.cur_privilege_lv = 0 -- 当前成就特权等级 self.cur_privilege_stage = false -- 当前查看的成就特权等级对应的成就等级 self.cur_show_privilege_index = 1 -- 当前展示的成就特权信息index self.is_exchange_index = false -- 当前处于交换交易券的页签 self.is_weekly_reward_index = false -- 当前处于周奖励的页签 self.privilege_awardItem = nil -- 成就特权奖励item self.mainVo = RoleManager.Instance.mainRoleInfo self.model = AchieveModel:getInstance() self.privilege_data = self.model:GetAchievePrivilegeTabData() -- 获取特权按钮数据 self.first_init = true self:Load() end function AchieveTotalView:Load_callback() local nodes = { "bg:raw", -- 背景图 -- "power_bg", "power:txt", -- 战力相关 "ques_btn:obj", "levelImg_con/lv_one:obj:img", "levelImg_con/lv_ten:obj:img", "levelImg_con/lv_hundred:obj:img", -- 成就等级相关 "achi_exp_fill:img", "achi_exp:tmp", -- 成就等级经验值 "next_attr_con", "cur_attr_con:obj", -- 成就等级属性容器 "privilege_scroll", "privilege_scroll/Viewport/privilege_con", -- 特权节点滚动容器 "privilege_con1:obj", -- 特权奖励节点类型1 "privilege_con1/privilege_receiveBtn:obj:imgex", -- 领取特权奖励 "privilege_con1/privilege_receiveBtn/privilege_receive_red:obj", --"privilege_con1/privilege_receiveBtn/privilege_receiveBtn_txt:tmp", "privilege_con1/privilege_reward_con", -- 特权奖励容器 "privilege_con2:obj", -- 特权奖励节点类型2 "privilege_con2/privilege_exchange1", "privilege_con2/privilege_exchange2", "privilege_con2/privilege_exchangeBtn:obj:imgex", "privilege_con2/privilege_exchangeBtn/privilege_exchange_red:obj", "privilege_con2/privilege_exchange_tip:tmp", "privilege_con2/privilege_exchangeBtn/privilege_exchangeBtn_txt:tmp", "privilege_desc:tmp", "privilege_name:tmp", -- 特权说明相关 "privilege_scroll/Viewport/privilege_con/privilege_progress_bg/privilege_fill:img", -- 特权进度相关 "privilege_scroll/Viewport/privilege_con/privilege_progress_bg", "privilegeIcon:img", "privilegeBtn:obj", "rightArrow:obj", "leftArrow:obj", "achi_lv:tmp", } self:GetChildren(nodes) -- 特权领取按钮文本 self.privilege_receive_flag = self:GetChild("privilege_con1/privilege_receiveBtn/Text"):GetComponent("TextMeshProUGUI") lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetAchieveBigPic("achi_total_bg_571_704"), true) self:AddEvents() self:UpdateView() end function AchieveTotalView:AddEvents( ) local function click_event(target) if target == self.privilege_receiveBtn_obj then -- 特权奖励领取 if not self.cur_privilege_stage then return end self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40908, self.cur_privilege_stage) elseif target == self.privilege_exchangeBtn_obj then -- 特权交易券兑换 self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40911) elseif target == self.ques_btn_obj then -- 成就系统介绍 GlobalEventSystem:Fire(EventName.OPEN_INSTRUCTION_VIEW, 409) elseif target == self.privilegeBtn_obj then -- 特权详情 self.model:Fire(AchieveModel.OPEN_ACHIEVE_PRIVILEGE_VIEW, true) elseif target == self.rightArrow_obj then -- 特权详情 self:ChangePrivilegeIndex(1) elseif target == self.leftArrow_obj then -- 特权详情 self:ChangePrivilegeIndex(-1) end end AddClickEvent(self.privilege_receiveBtn_obj, click_event) AddClickEvent(self.privilege_exchangeBtn_obj, click_event) AddClickEvent(self.ques_btn_obj, click_event) AddClickEvent(self.privilegeBtn_obj, click_event) AddClickEvent(self.rightArrow_obj, click_event) AddClickEvent(self.leftArrow_obj, click_event) local function update_achieve_lvdata() self:UpdateLevelInfo() self:UpdatePrivilegeExp() end self:BindEvent(self.model, AchieveModel.UPDATE_ACHIEVE_LV_DATA, update_achieve_lvdata) local function update_privilege_reward_status() self:UpdateSelectPrivilegeIndex( ) end self:BindEvent(self.model, AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS, update_privilege_reward_status) local function update_privilege_red(type) if type == AchieveModelRedType.Privilege or type == AchieveModelRedType.Exchange or type == AchieveModelRedType.Weekly then self:UpdatePrivilegeData() end end self:BindEvent(self.model, AchieveModel.UPDATE_ACHIEVE_RED, update_privilege_red) end function AchieveTotalView:UpdateView( ) self:UpdateLevelInfo() -- self:UpdatePrivilegeItem() -- 初始化时默认选中最新的当前特权 -- local cur_level = self.cur_achieve_lv local index = self.model:GetCanGetPrivilegeStage( ) self.cur_show_privilege_index = index -- 刷新特权 self:ChangePrivilegeIndex(0, true) end function AchieveTotalView:UpdateSelectPrivilegeIndex( ) local index = self.model:GetCanGetPrivilegeStage( ) self.cur_show_privilege_index = index -- 刷新特权 self:ChangePrivilegeIndex(0, true) end -- 更改特权索引 function AchieveTotalView:ChangePrivilegeIndex( change_index, force_update ) local old_index = self.cur_show_privilege_index self.cur_show_privilege_index = self.cur_show_privilege_index + change_index self.cur_show_privilege_index = Mathf.Clamp(self.cur_show_privilege_index, 1, #self.privilege_data) if force_update or old_index ~= self.cur_show_privilege_index then self:UpdatePrivilegeData(self.cur_show_privilege_index) self.leftArrow_obj:SetActive(self.cur_show_privilege_index ~= 1) self.rightArrow_obj:SetActive(self.cur_show_privilege_index ~= #self.privilege_data) end end -- 更新等级相关数据 force 强制刷新等级和属性条目 function AchieveTotalView:UpdateLevelInfo() self.achieve_lv_data = self.model:GetAchieveLvData() if self.achieve_lv_data and self.achieve_lv_data.lv then -- 设置当前成就经验值表现 local max_lv = TableSize(Config.Achievementstage) - 1 local key_lv = self.achieve_lv_data.lv >= max_lv and max_lv or self.achieve_lv_data.lv + 1 local lv_cfg = Config.Achievementstage[key_lv] local is_first = self.first_init -- 完成经验条动画后的回调 local after_exp_fill_update = function ( ) -- 设置经验描述 self.achi_exp_tmp.text = self.achieve_lv_data.lv < max_lv and string.format("%s/%s", self.achieve_lv_data.exp, lv_cfg.need_exp) or "MAX" -- 升级后才刷新的一些UI if self.achieve_lv_data.lv ~= self.cur_achieve_lv then self.cur_achieve_lv = self.achieve_lv_data.lv self.achi_lv_tmp.text = string.format('Lv.%s', self.cur_achieve_lv) -- self:UpdateAchieveLevel(self.cur_achieve_lv) self:UpdateLevelAttrItem(self.cur_achieve_lv) self:UpdatePrivilegeExp() -- 升级也要更新特权的进度 self:UpdateSelectPrivilegeIndex( ) -- 升级特效 if not is_first then self:AddUIEffect("ui_hunliqiudianliang", self.privilegeIcon, "UI", nil, 5, false, nil,nil,nil,nil,1) end -- 特权图标 local index = self.model:GetCurPrivilegeStage( ) lua_resM:setOutsideImageSprite(self, self.privilegeIcon_img, GameResPath.GetAchieveBigPic("achi_privilege_icon1"), true) SetLocalScale(self.privilegeIcon, 1.4, 1.4, 1) end end local new_rate = self.achieve_lv_data.lv < max_lv and (self.achieve_lv_data.exp / lv_cfg.need_exp) or 1 local old_rate = tonumber(self.achi_exp_fill_img.fillAmount) local old_lv = self.cur_achieve_lv local new_lv = self.achieve_lv_data.lv if not self.first_init then local need_time local need_time_2 local ANIM_TIME = 0.3 if old_lv and old_lv < new_lv then -- 涨满再归零再涨 -- 计算动画时间 need_time = 1 * (1 - old_rate) need_time = need_time >= ANIM_TIME and need_time or ANIM_TIME need_time_2 = 1 * new_rate need_time_2 = need_time_2 >= ANIM_TIME and need_time_2 or ANIM_TIME local end_func = function () self:ShowFillAmountAnim(0, new_rate, after_exp_fill_update, need_time_2 ) end self:ShowFillAmountAnim( old_rate, 1, end_func, need_time ) else -- 直接涨 need_time = 1 * (new_rate - old_rate) need_time = need_time >= ANIM_TIME and need_time or ANIM_TIME self:ShowFillAmountAnim( old_rate, new_rate, after_exp_fill_update, need_time ) end else -- 直接设置 self.achi_exp_fill_img.fillAmount = new_rate after_exp_fill_update() end if self.first_init then -- 除了第一次初始化 其他刷新都要动画 self.first_init = false end end end -- 进度动画 注意:new_rate > old_rate function AchieveTotalView:ShowFillAmountAnim( old_rate, new_rate, end_fun, need_time ) if self.tween_slider_id then TweenLite.Stop(self.tween_slider_id) self.tween_slider_id = nil end self.achi_exp_fill_img.fillAmount = old_rate self.tween_slider_id = TweenLite.to(self, self.achi_exp_fill_img, TweenLite.UiAnimationType.FILLAMOUNT, new_rate, need_time, end_fun) end -- 更新等级对应的属性信息 function AchieveTotalView:UpdateLevelAttrItem(level) local key = { [1] = "cur", [2] = "next", } local lv_data, attr_list, last_attr_list -- 等级配置,当前属性数据和上一级的属性配置 local total_lv = TableSize(Config.Achievementstage) - 1 local item, pos -- self.cur_attr_con_obj:SetActive(level > 0) for i = 1, 2 do -- 当前和下级属性的加载做成循环,节约代码量 level = level > total_lv and total_lv or level lv_data = Config.Achievementstage[level] attr_list = lv_data and stringtotable(lv_data.attr_list) or {} local show_count = 2 -- 展示的属性个数 for k, v in ipairs(attr_list) do item = self[key[i] .. "_attr_item"][k] if not item then item = AchieveTotalAttrItem.New(self[key[i] .. "_attr_con"]) self[key[i] .. "_attr_item"][k] = item end item:SetVisible(true) -- item:SetAnchoredPosition((1 - k % 2) * 187, math.ceil(k / 2) * -35 + 35) item:SetAnchoredPosition((1 - k % 2) * 187, -6) item:SetData(v, last_attr_list or nil) show_count = show_count - 1 if show_count <= 0 then break end end if #self[key[i] .. "_attr_item"] > #attr_list then for k = #attr_list + 1, #self[key[i] .. "_attr_item"] do self[key[i] .. "_attr_item"][k]:SetVisible(false) end end -- 等级自增一级,适应下一级属性的加载 level = level + 1 last_attr_list = DeepCopy(attr_list) if i == 1 then self.power_txt.text = "f" .. GetFighting(last_attr_list) -- 动态修改战力背景宽度 -- local power_bg_width = self.power_txt.preferredWidth > 224 and 303 - 224 + self.power_txt.preferredWidth or 303 -- SetSizeDeltaX(self.power_bg, power_bg_width) end end end function AchieveTotalView:UpdatePrivilegeExp( ) -- 计算特权进度,需要根据每一级所占的百分比来逐级计算 local persent = 0 -- 获取当前特权等级 self.cur_privilege_lv = self.model:GetAchievePrivilegeLv(self.cur_achieve_lv) if #self.privilege_data > 1 and self.cur_privilege_lv < #self.privilege_data then --每一级对应的百分比 local each_lv_pec = 1/(#self.privilege_data-1) persent = each_lv_pec * (self.cur_privilege_lv - 1) --当前特权等级大于1级时 --而第一个特权等级未0级,所以0→1级的进度一直为0 if self.cur_privilege_lv >= 1 then --当前成就等级距离上一级特权等级要求的等级数之差 local lv_difference = self.cur_achieve_lv - self.privilege_data[self.cur_privilege_lv].stage --获得下一级特权等级的等级要求与上一级之差 local stage_difference = self.privilege_data[self.cur_privilege_lv + 1].stage - self.privilege_data[self.cur_privilege_lv].stage --当前特权等级与下一级的实际百分比乘以每段等级间的距离长度百分数 local cur_lv_pec = lv_difference / stage_difference * each_lv_pec persent = persent + cur_lv_pec end elseif self.cur_privilege_lv == #self.privilege_data then persent = 1 end self.privilege_fill_img.fillAmount = persent end function AchieveTotalView:UpdatePrivilegeData(index) index = index or self.cur_show_privilege_index local data = self.privilege_data[index] -- 加载特权基础信息 self.privilege_name_tmp.text = string.format('Lv.%s %s', data.stage, Trim(data.name)) self.cur_privilege_stage = data.stage self.privilege_con1_obj:SetActive(true) self.is_exchange_index = data.icon == 4 self.is_weekly_reward_index = data.icon == 3 -- 领取状态 local progress_data, status -- if data.icon == 3 then -- 每周奖励状态 -- status = self.model:GetWeeklyPrivilegeRewardStatus() -- else progress_data = self.model:GetAchievePrivilegeStatus(data.stage) status = progress_data.status and progress_data.status or 0 -- end SetAnchoredPositionX(self.privilege_reward_con, 165) if not self.privilege_awardItem then self.privilege_awardItem = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.privilege_reward_con) self.privilege_awardItem:SetItemSize(62, 62) end local reward = stringtotable(data.reward)[1] self.privilege_awardItem:SetVisible(reward and true or false) if reward then local typeId, lock = GoodsModel:getInstance():GetMappingTypeId(reward[1], reward[2]) self.privilege_awardItem:SetData(typeId, reward[3], nil, nil, lock) end --self.privilege_receiveBtn_imgex.gray = status ~= 1 if status ~= 1 then self.privilege_receiveBtn_imgex.gray = true SetTMPSharedMaterial(self.privilege_receive_flag, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn) else self.privilege_receiveBtn_imgex.gray = false SetTMPSharedMaterial(self.privilege_receive_flag, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn) end self.privilege_receive_flag.text = status == 2 and "已领取" or "领取" self.privilege_receive_red_obj:SetActive(status == 1) -- end end function AchieveTotalView:__delete( ) for k, v in ipairs(self.cur_attr_item) do v:DeleteMe() v = nil end self.cur_attr_item = nil for k, v in ipairs(self.next_attr_item) do v:DeleteMe() v = nil end self.next_attr_item = nil for k, v in pairs(self.privilege_item) do v:DeleteMe() v = nil end self.privilege_item = nil if self.privilege_awardItem then UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.privilege_awardItem) self.privilege_awardItem = nil end if self.pri_ex1_awardItem then UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.pri_ex1_awardItem) self.pri_ex1_awardItem = nil end if self.pri_ex2_awardItem then UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.pri_ex2_awardItem) self.pri_ex2_awardItem = nil end if self.tween_slider_id then TweenLite.Stop(self.tween_slider_id) self.tween_slider_id = nil end self:ClearUIEffect(self.privilegeIcon) end