|
-- <*
|
|
-- @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
|