源战役客户端
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 

280 行
11 KiB

-- <*
-- @Author: Saber
-- @Description: 成就子类界面
-- *>
AchieveVarietyView = AchieveVarietyView or BaseClass(BaseItem)
local AchieveVarietyView = AchieveVarietyView
function AchieveVarietyView:__init(parent_wnd,prefab_asset,layer_name)
self.base_file = "achievement"
self.layout_file = "AchieveVarietyView"
self.parent_wnd = parent_wnd
self.layer_name = layer_name
self.type_id = 1 -- 当前查看的章节数
self.can_receive_reward = false -- 是否可领取章节奖励
self.model = AchieveModel:getInstance()
self.item_list = {}
self.item_index_cache = {} -- 记录当前每个成就对应的位置索引
self:Load()
end
function AchieveVarietyView:Load_callback()
local nodes = {
"total_con/progress_fill:img", "total_con/progress:tmp", -- 章节总览进度
"total_con/variety_name:tmp", "total_con/variety_guide:tmp", -- 章节信息
"total_con/receive_btn:obj:imgex", "total_con/receive_btn/receive_flag:tmp", -- 章节奖励领取按钮
"total_con/category_sp:raw", -- 章节立绘
-- 奖励称号图
"total_con/designation_con/designation_image:obj:img",
"total_con/designation_con/designation_name:tmp",
"total_con/designation_con/designation_effect",
"item_scroll:scroll", "item_scroll/Viewport/item_con", -- 成就节点容器
"total_con:raw",
}
self:GetChildren(nodes)
lua_resM:setOutsideRawImage(self, self.total_con_raw, GameResPath.GetAchieveBigPic("achieve_category_bg"), true)
self:AddEvents()
if self.need_refreshData then
self:UpdateView()
end
end
function AchieveVarietyView:AddEvents( )
--[[ local function click_event(target)
if target == self.receive_btn_obj then -- 领取成就章节奖励
if self.can_receive_reward then
self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40901, self.type_id)
end
end
end
AddClickEvent(self.receive_btn_obj, click_event)--]]
local function update_achieve_data(main_type, need_anim)
if main_type == self.type_id then
self.update_need_anim = need_anim
self:UpdateView()
end
end
self:BindEvent(self.model, AchieveModel.UPDATE_ACHIEVE_DATA, update_achieve_data)
-- local function update_main_type_progress()
-- self:UpdateCategoryTotalData()
-- end
-- self:BindEvent(self.model, AchieveModel.UPDATE_MAINTYPE_PROGRESS, update_main_type_progress)
-- self:BindEvent(self.model, AchieveModel.RECEIVE_CHAPTER_REWARD_SUCCEED, update_main_type_progress)
end
function AchieveVarietyView:UpdateView(need_top )
-- self:UpdateCategoryBasicData()
-- self:UpdateCategoryTotalData()
self:UpdateAchieveItem(need_top)
end
-- 更新章节成就节点
function AchieveVarietyView:UpdateAchieveItem( need_top )
local achi_list = self.model:GetAchieveDataByMainType(self.type_id)
self.achi_item_creator = self.achi_item_creator or self:AddUIComponent(UI.ItemListCreator)
-- print('=========Msh:AchieveVarietyView.lua[80] data', data)
-- 停止一下动画
self.model:SetAchieveItemAnimState(false) -- 默认设置没有动画
self.model:SetSCMDWaitFlag(false) -- 初始化协议等待标志
self.item_scroll_scroll.vertical = true
self.achi_item_creator:IterateItems(function ( item, i )
item:StopAnim(i)
end)
if need_top then -- 置顶
self.achi_item_creator:Reset()
end
-- print('Msh:AchieveVarietyView.lua[83] 旧', data)
-- PrintTable(self.item_index_cache)
-- 更新完全部item后回调(动画可能还在播)
local update_cache_func = function ( )
self.update_need_anim = false
-- print('Msh:AchieveVarietyView.lua[113] 新', data)
-- PrintTable(self.item_index_cache)
end
-- 使用的item数目
local ITEM_NUM = 8
-- 播完动画的回调
self.animing_item_count = ITEM_NUM
local anim_call_back = function ()
self.animing_item_count = self.animing_item_count - 1
if self.animing_item_count <= 0 then
self.model:SetAchieveItemAnimState(false) -- 动画完毕
self.item_scroll_scroll.vertical = true
self.model:Fire(AchieveModel.UPDATE_BASE_VIEW) -- 检查是否需要跳转
end
end
-- 找出一次性位移 很多索引 的数据
local down_item_new_index = false
local down_item_data = false
if self.update_need_anim then
self.model:SetAchieveItemAnimState(true) -- 动画中
self.item_scroll_scroll.vertical = false
for new_index, v in ipairs(achi_list) do
local key = v.type * 10000 + v.sub_type
local old_index = self.item_index_cache[key]
if old_index and new_index - old_index >= ITEM_NUM then
down_item_data = v
down_item_new_index = new_index
end
end
end
local info = {
data_list = achi_list,
item_con = self.item_con,
scroll_view = self.item_scroll,
item_class = AchieveItem,
item_height = AchieveItem.HEIGHT,
start_y = AchieveItem.START_Y,
space_y = AchieveItem.SPACE_Y,
create_frequency = 0.01,
alignment = UnityEngine.TextAnchor.UpperLeft,
reuse_item_num = ITEM_NUM,
add_height = 0,
on_update_item = function(item, i, v)
if i == ITEM_NUM and down_item_data and self.update_need_anim then -- 拿一下这个平时看不到的item用一用
local key = down_item_data.type * 10000 + down_item_data.sub_type
local old_index = self.item_index_cache[key]
local new_index = down_item_new_index
-- print('Msh:AchieveVarietyView.lua[101] =======下降很多=============data', old_index, new_index)
-- 这个item是借用的 得还回去 所以单独给他刷一刷新
local anim_call_back_update = function ( )
self.achi_item_creator:IterateItems(function ( item_temp, ii, vv )
if item_temp == item then
-- print('Msh:AchieveVarietyView.lua[143] 刷新了借用的ITEM')
-- PrintTable(vv)
item:SetData(vv, ii)
item:SetIndexPos(ii)
end
end)
anim_call_back()
end
item:MoveNewIndexPosAnimAndUpdate(old_index, new_index, down_item_data, anim_call_back_update)
self.item_index_cache[key] = new_index
down_item_data = nil
else
local key = v.type * 10000 + v.sub_type
local need_anim = self.update_need_anim and self.item_index_cache[key]
local old_index = need_anim and self.item_index_cache[key] or i
local new_index = i
-- print('Msh:AchieveVarietyView.lua[136] data', old_index, new_index)
if need_anim then
item:MoveNewIndexPosAnimAndUpdate(old_index, new_index, v, anim_call_back)
else
if self.update_need_anim then
anim_call_back() -- 这个item不走动画 直接回调
end
item:SetData(v, new_index)
end
self.item_index_cache[key] = new_index
end
end,
final_callback = update_cache_func,
}
self.achi_item_creator:UpdateItems(info)
end
-- 更新章节成就节点
--[[function AchieveVarietyView:UpdateAchieveItemNew( need_top )
local achi_list = self.model:GetAchieveDataByMainType(self.type_id)
local ITEM_HEIGHT = AchieveItem.HEIGHT
local START_Y = AchieveItem.START_Y
self:HideAllItems( )
-- local new_index_cache = {}
self.animing_item_count = #achi_list
local anim_call_back = function ()
self.animing_item_count = self.animing_item_count - 1
if self.animing_item_count <= 0 then
--logWarn('=======Msh:AchieveVarietyView.lua[206]=======')
self.model:Fire(AchieveModel.UPDATE_BASE_VIEW)
end
end
for i, v in ipairs(achi_list) do
local delay_create = function()
local key = v.type * 10000 + v.sub_type
local need_anim = self.update_need_anim and self.item_index_cache[key]
local old_index = need_anim and self.item_index_cache[key] or i
local new_index = i
local item = self.item_list[old_index]
if not item then
item = AchieveItem.New(self.item_con)
self.item_list[old_index] = item
end
item:SetVisible(true)
if need_anim then
item:MoveNewIndexPosAnimAndUpdate(new_index, v, anim_call_back)
else
item:SetData(v, old_index)
item:SetPosition( 0, START_Y - (old_index-1) * ITEM_HEIGHT)
end
self.item_index_cache[key] = new_index
end
if self.update_need_anim then -- 有动画显示需求就不延迟了
delay_create()
else
setTimeout(delay_create, 0)
end
end
-- logWarn('=======Msh:AchieveVarietyView.lua[220]=======')
-- PrintTable(self.item_index_cache)
SetSizeDeltaY(self.item_con, ITEM_HEIGHT * #achi_list - START_Y)
if need_top then -- 置顶
SetLocalPositionY(self.item_con, 0)
end
self.update_need_anim = false
self:UpdateItemListKey( )
end--]]
-- 更新Item_list的索引(保持与item数据的index一致)
function AchieveVarietyView:UpdateItemListKey( )
local new_list = {}
for k,v in pairs(self.item_list) do
if v.index and k ~= v.index then
new_list[v.index] = v
self.item_list[k] = nil
end
end
-- 这部分应该是还没被使用的 也插进新表
for k, v in pairs(self.item_list) do
new_list[k] = v
end
self.item_list = new_list
end
-- 隐藏所有节点
function AchieveVarietyView:HideAllItems( )
for k,v in pairs(self.item_list) do
v:SetVisible(false)
v:StopAnim()
end
end
-- 置顶
function AchieveVarietyView:SetMainType( type_id , need_top )
self.type_id = type_id
self.item_index_cache = {} -- 切页签重置索引缓存
if self.is_loaded then
self.need_refreshData = false
self:UpdateView(need_top)
else
self.need_refreshData = true
end
end
function AchieveVarietyView:__delete( )
for k,v in pairs(self.item_list) do
v:DeleteMe()
end
self.item_list = nil
self.model:SetAchieveItemAnimState(false)
end