源战役客户端
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

280 linhas
11 KiB

4 semanas atrás
  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 成就子类界面
  4. -- *>
  5. AchieveVarietyView = AchieveVarietyView or BaseClass(BaseItem)
  6. local AchieveVarietyView = AchieveVarietyView
  7. function AchieveVarietyView:__init(parent_wnd,prefab_asset,layer_name)
  8. self.base_file = "achievement"
  9. self.layout_file = "AchieveVarietyView"
  10. self.parent_wnd = parent_wnd
  11. self.layer_name = layer_name
  12. self.type_id = 1 -- 当前查看的章节数
  13. self.can_receive_reward = false -- 是否可领取章节奖励
  14. self.model = AchieveModel:getInstance()
  15. self.item_list = {}
  16. self.item_index_cache = {} -- 记录当前每个成就对应的位置索引
  17. self:Load()
  18. end
  19. function AchieveVarietyView:Load_callback()
  20. local nodes = {
  21. "total_con/progress_fill:img", "total_con/progress:tmp", -- 章节总览进度
  22. "total_con/variety_name:tmp", "total_con/variety_guide:tmp", -- 章节信息
  23. "total_con/receive_btn:obj:imgex", "total_con/receive_btn/receive_flag:tmp", -- 章节奖励领取按钮
  24. "total_con/category_sp:raw", -- 章节立绘
  25. -- 奖励称号图
  26. "total_con/designation_con/designation_image:obj:img",
  27. "total_con/designation_con/designation_name:tmp",
  28. "total_con/designation_con/designation_effect",
  29. "item_scroll:scroll", "item_scroll/Viewport/item_con", -- 成就节点容器
  30. "total_con:raw",
  31. }
  32. self:GetChildren(nodes)
  33. lua_resM:setOutsideRawImage(self, self.total_con_raw, GameResPath.GetAchieveBigPic("achieve_category_bg"), true)
  34. self:AddEvents()
  35. if self.need_refreshData then
  36. self:UpdateView()
  37. end
  38. end
  39. function AchieveVarietyView:AddEvents( )
  40. --[[ local function click_event(target)
  41. if target == self.receive_btn_obj then -- 领取成就章节奖励
  42. if self.can_receive_reward then
  43. self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40901, self.type_id)
  44. end
  45. end
  46. end
  47. AddClickEvent(self.receive_btn_obj, click_event)--]]
  48. local function update_achieve_data(main_type, need_anim)
  49. if main_type == self.type_id then
  50. self.update_need_anim = need_anim
  51. self:UpdateView()
  52. end
  53. end
  54. self:BindEvent(self.model, AchieveModel.UPDATE_ACHIEVE_DATA, update_achieve_data)
  55. -- local function update_main_type_progress()
  56. -- self:UpdateCategoryTotalData()
  57. -- end
  58. -- self:BindEvent(self.model, AchieveModel.UPDATE_MAINTYPE_PROGRESS, update_main_type_progress)
  59. -- self:BindEvent(self.model, AchieveModel.RECEIVE_CHAPTER_REWARD_SUCCEED, update_main_type_progress)
  60. end
  61. function AchieveVarietyView:UpdateView(need_top )
  62. -- self:UpdateCategoryBasicData()
  63. -- self:UpdateCategoryTotalData()
  64. self:UpdateAchieveItem(need_top)
  65. end
  66. -- 更新章节成就节点
  67. function AchieveVarietyView:UpdateAchieveItem( need_top )
  68. local achi_list = self.model:GetAchieveDataByMainType(self.type_id)
  69. self.achi_item_creator = self.achi_item_creator or self:AddUIComponent(UI.ItemListCreator)
  70. -- print('=========Msh:AchieveVarietyView.lua[80] data', data)
  71. -- 停止一下动画
  72. self.model:SetAchieveItemAnimState(false) -- 默认设置没有动画
  73. self.model:SetSCMDWaitFlag(false) -- 初始化协议等待标志
  74. self.item_scroll_scroll.vertical = true
  75. self.achi_item_creator:IterateItems(function ( item, i )
  76. item:StopAnim(i)
  77. end)
  78. if need_top then -- 置顶
  79. self.achi_item_creator:Reset()
  80. end
  81. -- print('Msh:AchieveVarietyView.lua[83] 旧', data)
  82. -- PrintTable(self.item_index_cache)
  83. -- 更新完全部item后回调(动画可能还在播)
  84. local update_cache_func = function ( )
  85. self.update_need_anim = false
  86. -- print('Msh:AchieveVarietyView.lua[113] 新', data)
  87. -- PrintTable(self.item_index_cache)
  88. end
  89. -- 使用的item数目
  90. local ITEM_NUM = 8
  91. -- 播完动画的回调
  92. self.animing_item_count = ITEM_NUM
  93. local anim_call_back = function ()
  94. self.animing_item_count = self.animing_item_count - 1
  95. if self.animing_item_count <= 0 then
  96. self.model:SetAchieveItemAnimState(false) -- 动画完毕
  97. self.item_scroll_scroll.vertical = true
  98. self.model:Fire(AchieveModel.UPDATE_BASE_VIEW) -- 检查是否需要跳转
  99. end
  100. end
  101. -- 找出一次性位移 很多索引 的数据
  102. local down_item_new_index = false
  103. local down_item_data = false
  104. if self.update_need_anim then
  105. self.model:SetAchieveItemAnimState(true) -- 动画中
  106. self.item_scroll_scroll.vertical = false
  107. for new_index, v in ipairs(achi_list) do
  108. local key = v.type * 10000 + v.sub_type
  109. local old_index = self.item_index_cache[key]
  110. if old_index and new_index - old_index >= ITEM_NUM then
  111. down_item_data = v
  112. down_item_new_index = new_index
  113. end
  114. end
  115. end
  116. local info = {
  117. data_list = achi_list,
  118. item_con = self.item_con,
  119. scroll_view = self.item_scroll,
  120. item_class = AchieveItem,
  121. item_height = AchieveItem.HEIGHT,
  122. start_y = AchieveItem.START_Y,
  123. space_y = AchieveItem.SPACE_Y,
  124. create_frequency = 0.01,
  125. alignment = UnityEngine.TextAnchor.UpperLeft,
  126. reuse_item_num = ITEM_NUM,
  127. add_height = 0,
  128. on_update_item = function(item, i, v)
  129. if i == ITEM_NUM and down_item_data and self.update_need_anim then -- 拿一下这个平时看不到的item用一用
  130. local key = down_item_data.type * 10000 + down_item_data.sub_type
  131. local old_index = self.item_index_cache[key]
  132. local new_index = down_item_new_index
  133. -- print('Msh:AchieveVarietyView.lua[101] =======下降很多=============data', old_index, new_index)
  134. -- 这个item是借用的 得还回去 所以单独给他刷一刷新
  135. local anim_call_back_update = function ( )
  136. self.achi_item_creator:IterateItems(function ( item_temp, ii, vv )
  137. if item_temp == item then
  138. -- print('Msh:AchieveVarietyView.lua[143] 刷新了借用的ITEM')
  139. -- PrintTable(vv)
  140. item:SetData(vv, ii)
  141. item:SetIndexPos(ii)
  142. end
  143. end)
  144. anim_call_back()
  145. end
  146. item:MoveNewIndexPosAnimAndUpdate(old_index, new_index, down_item_data, anim_call_back_update)
  147. self.item_index_cache[key] = new_index
  148. down_item_data = nil
  149. else
  150. local key = v.type * 10000 + v.sub_type
  151. local need_anim = self.update_need_anim and self.item_index_cache[key]
  152. local old_index = need_anim and self.item_index_cache[key] or i
  153. local new_index = i
  154. -- print('Msh:AchieveVarietyView.lua[136] data', old_index, new_index)
  155. if need_anim then
  156. item:MoveNewIndexPosAnimAndUpdate(old_index, new_index, v, anim_call_back)
  157. else
  158. if self.update_need_anim then
  159. anim_call_back() -- 这个item不走动画 直接回调
  160. end
  161. item:SetData(v, new_index)
  162. end
  163. self.item_index_cache[key] = new_index
  164. end
  165. end,
  166. final_callback = update_cache_func,
  167. }
  168. self.achi_item_creator:UpdateItems(info)
  169. end
  170. -- 更新章节成就节点
  171. --[[function AchieveVarietyView:UpdateAchieveItemNew( need_top )
  172. local achi_list = self.model:GetAchieveDataByMainType(self.type_id)
  173. local ITEM_HEIGHT = AchieveItem.HEIGHT
  174. local START_Y = AchieveItem.START_Y
  175. self:HideAllItems( )
  176. -- local new_index_cache = {}
  177. self.animing_item_count = #achi_list
  178. local anim_call_back = function ()
  179. self.animing_item_count = self.animing_item_count - 1
  180. if self.animing_item_count <= 0 then
  181. --logWarn('=======Msh:AchieveVarietyView.lua[206]=======')
  182. self.model:Fire(AchieveModel.UPDATE_BASE_VIEW)
  183. end
  184. end
  185. for i, v in ipairs(achi_list) do
  186. local delay_create = function()
  187. local key = v.type * 10000 + v.sub_type
  188. local need_anim = self.update_need_anim and self.item_index_cache[key]
  189. local old_index = need_anim and self.item_index_cache[key] or i
  190. local new_index = i
  191. local item = self.item_list[old_index]
  192. if not item then
  193. item = AchieveItem.New(self.item_con)
  194. self.item_list[old_index] = item
  195. end
  196. item:SetVisible(true)
  197. if need_anim then
  198. item:MoveNewIndexPosAnimAndUpdate(new_index, v, anim_call_back)
  199. else
  200. item:SetData(v, old_index)
  201. item:SetPosition( 0, START_Y - (old_index-1) * ITEM_HEIGHT)
  202. end
  203. self.item_index_cache[key] = new_index
  204. end
  205. if self.update_need_anim then -- 有动画显示需求就不延迟了
  206. delay_create()
  207. else
  208. setTimeout(delay_create, 0)
  209. end
  210. end
  211. -- logWarn('=======Msh:AchieveVarietyView.lua[220]=======')
  212. -- PrintTable(self.item_index_cache)
  213. SetSizeDeltaY(self.item_con, ITEM_HEIGHT * #achi_list - START_Y)
  214. if need_top then -- 置顶
  215. SetLocalPositionY(self.item_con, 0)
  216. end
  217. self.update_need_anim = false
  218. self:UpdateItemListKey( )
  219. end--]]
  220. -- 更新Item_list的索引(保持与item数据的index一致)
  221. function AchieveVarietyView:UpdateItemListKey( )
  222. local new_list = {}
  223. for k,v in pairs(self.item_list) do
  224. if v.index and k ~= v.index then
  225. new_list[v.index] = v
  226. self.item_list[k] = nil
  227. end
  228. end
  229. -- 这部分应该是还没被使用的 也插进新表
  230. for k, v in pairs(self.item_list) do
  231. new_list[k] = v
  232. end
  233. self.item_list = new_list
  234. end
  235. -- 隐藏所有节点
  236. function AchieveVarietyView:HideAllItems( )
  237. for k,v in pairs(self.item_list) do
  238. v:SetVisible(false)
  239. v:StopAnim()
  240. end
  241. end
  242. -- 置顶
  243. function AchieveVarietyView:SetMainType( type_id , need_top )
  244. self.type_id = type_id
  245. self.item_index_cache = {} -- 切页签重置索引缓存
  246. if self.is_loaded then
  247. self.need_refreshData = false
  248. self:UpdateView(need_top)
  249. else
  250. self.need_refreshData = true
  251. end
  252. end
  253. function AchieveVarietyView:__delete( )
  254. for k,v in pairs(self.item_list) do
  255. v:DeleteMe()
  256. end
  257. self.item_list = nil
  258. self.model:SetAchieveItemAnimState(false)
  259. end