源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

288 lines
10 KiB

-- <*
-- @Author: Saber
-- @Description: 成就子类节点item
-- *>
AchieveItem = AchieveItem or BaseClass(BaseItem)
local AchieveItem = AchieveItem
AchieveItem.HEIGHT = 100
AchieveItem.WIDTH = 701
AchieveItem.START_Y = -1
AchieveItem.SPACE_Y = 2
function AchieveItem:__init(parent_wnd,prefab_asset,layer_name)
self.base_file = "achievement"
self.layout_file = "AchieveItem"
self.parent_wnd = parent_wnd
self.layer_name = layer_name
self.awardItem_list = {}
self.model = AchieveModel:getInstance()
self:Load()
end
function AchieveItem:Load_callback()
local nodes = {
"icon:img", "finished:obj", -- 展示小图片相关
"award_con", -- 奖励容器
"fill:img", "progress:tmp", -- 成就进度相关
"name:tmp", -- 成就名
"achi_exp:tmp", -- 成就经验
"goto_btn:obj", "receive_btn:obj", -- 按钮相关
}
self:GetChildren(nodes)
self:AddEvents()
if self.need_refreshData then
self:UpdateView()
end
end
function AchieveItem:AddEvents( )
local function click_event(target)
if self.model:AchieveItemIsAniming() then
return
end
if self.model:GetSCMDWaitFlag() then -- 刚发过协议在等协议返回
return
end
if target == self.goto_btn_obj then -- 前往成就任务
self:OnClickGotoBtnFunc()
elseif target == self.receive_btn_obj then -- 领取成就奖励
if self.data and self.data.type and self.data.sub_type and self.data.id then
self.model:SetSCMDWaitFlag(true)
self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40903, self.data.type, self.data.sub_type, self.data.id)
end
end
end
AddClickEvent(self.goto_btn_obj, click_event, nil, false)
AddClickEvent(self.receive_btn_obj, click_event, nil, false)
end
function AchieveItem:SetData( data, index )
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.transform)
self.data = data
self.index = index or self.index
if self.is_loaded then
self.need_refreshData = false
self:UpdateView()
else
self.need_refreshData = true
end
end
function AchieveItem:UpdateView( )
self:UpdateAchieveBasicData()
self:UpdateAchieveProgressData()
end
-- 更新成就基础信息(只调用一次)
function AchieveItem:UpdateAchieveBasicData( )
local str = string.gsub(Trim(self.data.desc), "\n", "")
self.name_tmp.text = LimitTextByCharNum(str, 14)
self.achi_exp_tmp.text = string.format("成就经验<color=%s>+%s</color>", ColorUtil.GREEN_DARK, self.data.exp)
lua_resM:setImageSprite(self, self.icon_img, "achievement_asset", "achi_item_icon" .. self.data.type, true)
-- 加载奖励
local reward = stringtotable(self.data.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.award_con)
self.awardItem_list[k] = item
end
item:SetItemSize(59, 59)
item:SetPosition(self.award_con.sizeDelta.x/2 +((k-1) - #reward/2) * 78 + 2, -2)
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
-- 更新成就进度信息
function AchieveItem:UpdateAchieveProgressData( )
if not self.data or not self.data.type or not self.data.sub_type then return end
local achieve_cfg = Config.Achievementid[self.data.type.."@"..self.data.sub_type.."@"..self.data.id]
-- local progress_data = self.model:GetTargetAchieveData(self.data.type, self.data.sub_type)
-- progress_data.progress = progress_data.progress or 0
-- progress_data.status = progress_data.status or 0
-- progress_data.id = progress_data.id or 1
local progress_data = self.data -- self.data里面有
if achieve_cfg then
local condition = stringtotable(achieve_cfg.condition)[1] -- 将成就的需求总数固定存在条件的第一个中
local percentage = 0
if condition[1] == "arena_rank" then -- 竞技联赛不显示进度,改为追加显示当前排行
percentage = progress_data.status == 0 and 0 or 1
local my_info = PkRankModel:getInstance().my_info
if progress_data.status ~= 0 then
self.progress_tmp.text = ""
elseif not my_info or not my_info.rank or my_info.rank == 0 then
self.progress_tmp.text = "当前名次:未上榜"
else
self.progress_tmp.text = string.format("当前名次:%s", tostring(my_info.rank))
end
elseif condition[1] == "uranium_skill" or condition[1] == "dun_visus" then -- 技能激活/幻光副本
percentage = progress_data.progress / condition[3]
self.progress_tmp.text = progress_data.progress .. "/" .. condition[3]
elseif condition[1] == "stage" then -- 进阶
percentage = progress_data.progress / 1
self.progress_tmp.text = progress_data.progress .. "/1"
else
percentage = progress_data.progress / condition[2]
self.progress_tmp.text = progress_data.progress .. "/" .. condition[2]
end
self.fill_img.fillAmount = percentage
self.goto_btn_obj:SetActive(progress_data.status == 0)
self.receive_btn_obj:SetActive(progress_data.status == 1)
self.finished_obj:SetActive(progress_data.status == 2)
end
end
function AchieveItem:OnClickGotoBtnFunc( )
local jump_tb = stringtotable(self.data.client_skip)[1]
-- 不管怎样先关界面
if IsTableEmpty(jump_tb) then -- 没有跳转则直接关闭角色系统界面
-- GlobalEventSystem:Fire(EventName.CLOSE_NEW_MAIN_ROLE_VIEW)
-- self.model:Fire(AchieveModel.OPEN_ACHIEVE_MAIN_VIEW)
else
if jump_tb[1] == 500 then -- 500 护送任务要关闭成就界面
-- GlobalEventSystem:Fire(EventName.CLOSE_NEW_MAIN_ROLE_VIEW)
-- self.model:Fire(AchieveModel.OPEN_ACHIEVE_MAIN_VIEW)
DailyModel:getInstance():Fire(DailyModel.CLOSE_DAILY_BASE_VIEW)
OpenFun.Open(jump_tb[1], jump_tb[2])
elseif jump_tb[3] then
GlobalEventSystem:Fire(EventName.OPEN_ACITVITY_TIP, jump_tb[1], jump_tb[2], true)
else
OpenFun.Open(jump_tb[1], jump_tb[2])
end
end
end
-- 移动到新索引的位置
function AchieveItem:MoveNewIndexPosAnimAndUpdate( old_index, new_index, new_data, anim_call_back )
local origin_pos = self:GetIndexPos(old_index)
local move_one_index_time = 0.15
-- logWarn('=======Msh:AchieveItem.lua[161]=======', self.index, new_index)
local old_index = old_index
local anim_call_back = anim_call_back or nil
self.index = new_index -- 存一下新索引
-- 动画完成后更新索引
local last_func = function( )
if anim_call_back then
anim_call_back()
end
-- self.index = self.new_index
-- self.new_index = nil
-- self:UpdateView()
-- print('Msh:AchieveItem.lua[166] data', self.data.type * 10000 + self.data.sub_type, self.index)
end
if new_index > old_index then -- 位置下移
--print('Msh:AchieveItem.lua[177] 位置下移', data)
-- 从目标索引位置右边 移动到目标索引位置
local move_func1 = function( )
self:SetData( new_data) -- 消失后 刷新
self:PlayLineAnim(self:GetIndexPos(new_index, AchieveItem.WIDTH - 100),
self:GetIndexPos(new_index),
move_one_index_time,
last_func)
end
-- 先往右移
self:PlayLineAnim(origin_pos, self:GetIndexPos(old_index, AchieveItem.WIDTH - 100),
move_one_index_time, move_func1)
elseif old_index - new_index == 1 then -- 上移一格
--print('Msh:AchieveItem.lua[190] 上移一格', data)
self:SetData( new_data) -- 直接刷
self:PlayLineAnim(origin_pos, self:GetIndexPos(new_index), move_one_index_time ,last_func, move_one_index_time)
elseif old_index == new_index then -- 位置不变
if self.data and self.data.id ~= new_data.id and
self.data.sub_type == new_data.sub_type and
self.data.type == new_data.type
then -- 数据变更了 原地刷新
--print('Msh:AchieveItem.lua[194] 位置不变 动画', data)
-- 从目标索引位置右边 移动到目标索引位置
local move_func1 = function( )
self:SetData( new_data) -- 消失后 刷新
-- 从左边 回来
self:PlayLineAnim(
self:GetIndexPos(new_index, - (AchieveItem.WIDTH + 100)),
self:GetIndexPos(new_index),
move_one_index_time,
last_func)
end
-- 先往右移
self:PlayLineAnim(origin_pos, self:GetIndexPos(old_index, AchieveItem.WIDTH - 100),
move_one_index_time, move_func1)
else
--print('Msh:AchieveItem.lua[194] 位置不变 只刷新', data)
last_func()
self:SetData( new_data) -- 直接刷新
end
else
self:SetData( new_data, new_index)
last_func()
-- logWarn('=======Msh:AchieveItem.lua[167]==MOVE POS IS ERROR=====')
end
end
-- 移动到目标位置
function AchieveItem:PlayLineAnim( start_pos, end_pos, anim_time, end_func, delay_time )
self:SetPosition(start_pos.x, start_pos.y, start_pos.z)
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.transform)
local anim_time = anim_time or 0.2
local delay_time = delay_time or 0
-- 延迟
local action1 = cc.DelayTime.New( delay_time )
-- 位移
local function move_func( percent )
SetLocalPosition(self.transform, start_pos.x + (end_pos.x - start_pos.x) * percent,
start_pos.y + (end_pos.y - start_pos.y) * percent, 0)
end
local action2 = cc.CustomUpdate.New(anim_time, move_func)
-- 回调
local function callback_1()
if end_func then
end_func()
end
end
local call_func_1 = cc.CallFunc.New(callback_1)
local action10 = cc.Sequence.New( action1, action2, call_func_1 )
self:AddAction(action10, self.transform)
end
function AchieveItem:GetIndexPos( index, offset_x )
local offset_x = offset_x or 0
return Vector3(offset_x, AchieveItem.START_Y - (index-1) * (AchieveItem.HEIGHT + AchieveItem.SPACE_Y), 0)
end
function AchieveItem:SetIndexPos( index )
local pos = self:GetIndexPos( index )
self:SetPosition(pos.x, pos.y, pos.z)
end
-- 停止当前动画
function AchieveItem:StopAnim( )
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.transform)
if self.index then
local pos = self:GetIndexPos(self.index)
self:SetPosition(pos.x, pos.y)
end
end
function AchieveItem:__delete( )
for i,item in pairs(self.awardItem_list) do
UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, item)
end
self.awardItem_list = {}
cc.ActionManager:getInstance():removeAllActionsFromTarget(self.transform)
end