源战役客户端
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 

382 líneas
17 KiB

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