源战役客户端
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

287 wiersze
10 KiB

4 tygodni temu
  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 成就子类节点item
  4. -- *>
  5. AchieveItem = AchieveItem or BaseClass(BaseItem)
  6. local AchieveItem = AchieveItem
  7. AchieveItem.HEIGHT = 100
  8. AchieveItem.WIDTH = 701
  9. AchieveItem.START_Y = -1
  10. AchieveItem.SPACE_Y = 2
  11. function AchieveItem:__init(parent_wnd,prefab_asset,layer_name)
  12. self.base_file = "achievement"
  13. self.layout_file = "AchieveItem"
  14. self.parent_wnd = parent_wnd
  15. self.layer_name = layer_name
  16. self.awardItem_list = {}
  17. self.model = AchieveModel:getInstance()
  18. self:Load()
  19. end
  20. function AchieveItem:Load_callback()
  21. local nodes = {
  22. "icon:img", "finished:obj", -- 展示小图片相关
  23. "award_con", -- 奖励容器
  24. "fill:img", "progress:tmp", -- 成就进度相关
  25. "name:tmp", -- 成就名
  26. "achi_exp:tmp", -- 成就经验
  27. "goto_btn:obj", "receive_btn:obj", -- 按钮相关
  28. }
  29. self:GetChildren(nodes)
  30. self:AddEvents()
  31. if self.need_refreshData then
  32. self:UpdateView()
  33. end
  34. end
  35. function AchieveItem:AddEvents( )
  36. local function click_event(target)
  37. if self.model:AchieveItemIsAniming() then
  38. return
  39. end
  40. if self.model:GetSCMDWaitFlag() then -- 刚发过协议在等协议返回
  41. return
  42. end
  43. if target == self.goto_btn_obj then -- 前往成就任务
  44. self:OnClickGotoBtnFunc()
  45. elseif target == self.receive_btn_obj then -- 领取成就奖励
  46. if self.data and self.data.type and self.data.sub_type and self.data.id then
  47. self.model:SetSCMDWaitFlag(true)
  48. self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40903, self.data.type, self.data.sub_type, self.data.id)
  49. end
  50. end
  51. end
  52. AddClickEvent(self.goto_btn_obj, click_event, nil, false)
  53. AddClickEvent(self.receive_btn_obj, click_event, nil, false)
  54. end
  55. function AchieveItem:SetData( data, index )
  56. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.transform)
  57. self.data = data
  58. self.index = index or self.index
  59. if self.is_loaded then
  60. self.need_refreshData = false
  61. self:UpdateView()
  62. else
  63. self.need_refreshData = true
  64. end
  65. end
  66. function AchieveItem:UpdateView( )
  67. self:UpdateAchieveBasicData()
  68. self:UpdateAchieveProgressData()
  69. end
  70. -- 更新成就基础信息(只调用一次)
  71. function AchieveItem:UpdateAchieveBasicData( )
  72. local str = string.gsub(Trim(self.data.desc), "\n", "")
  73. self.name_tmp.text = LimitTextByCharNum(str, 14)
  74. self.achi_exp_tmp.text = string.format("成就经验<color=%s>+%s</color>", ColorUtil.GREEN_DARK, self.data.exp)
  75. lua_resM:setImageSprite(self, self.icon_img, "achievement_asset", "achi_item_icon" .. self.data.type, true)
  76. -- 加载奖励
  77. local reward = stringtotable(self.data.reward)
  78. for k, v in ipairs(reward) do
  79. local item = self.awardItem_list[k]
  80. if not item then
  81. item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.award_con)
  82. self.awardItem_list[k] = item
  83. end
  84. item:SetItemSize(59, 59)
  85. item:SetPosition(self.award_con.sizeDelta.x/2 +((k-1) - #reward/2) * 78 + 2, -2)
  86. item:SetVisible(true)
  87. local typeId, lock = GoodsModel:getInstance():GetMappingTypeId(v[1], v[2])
  88. item:SetData(typeId, v[3], nil, nil, lock)
  89. end
  90. if #reward < #self.awardItem_list then
  91. for i = #reward+1, #self.awardItem_list do
  92. self.awardItem_list[i]:SetVisible(false)
  93. end
  94. end
  95. end
  96. -- 更新成就进度信息
  97. function AchieveItem:UpdateAchieveProgressData( )
  98. if not self.data or not self.data.type or not self.data.sub_type then return end
  99. local achieve_cfg = Config.Achievementid[self.data.type.."@"..self.data.sub_type.."@"..self.data.id]
  100. -- local progress_data = self.model:GetTargetAchieveData(self.data.type, self.data.sub_type)
  101. -- progress_data.progress = progress_data.progress or 0
  102. -- progress_data.status = progress_data.status or 0
  103. -- progress_data.id = progress_data.id or 1
  104. local progress_data = self.data -- self.data里面有
  105. if achieve_cfg then
  106. local condition = stringtotable(achieve_cfg.condition)[1] -- 将成就的需求总数固定存在条件的第一个中
  107. local percentage = 0
  108. if condition[1] == "arena_rank" then -- 竞技联赛不显示进度,改为追加显示当前排行
  109. percentage = progress_data.status == 0 and 0 or 1
  110. local my_info = PkRankModel:getInstance().my_info
  111. if progress_data.status ~= 0 then
  112. self.progress_tmp.text = ""
  113. elseif not my_info or not my_info.rank or my_info.rank == 0 then
  114. self.progress_tmp.text = "当前名次:未上榜"
  115. else
  116. self.progress_tmp.text = string.format("当前名次:%s", tostring(my_info.rank))
  117. end
  118. elseif condition[1] == "uranium_skill" or condition[1] == "dun_visus" then -- 技能激活/幻光副本
  119. percentage = progress_data.progress / condition[3]
  120. self.progress_tmp.text = progress_data.progress .. "/" .. condition[3]
  121. elseif condition[1] == "stage" then -- 进阶
  122. percentage = progress_data.progress / 1
  123. self.progress_tmp.text = progress_data.progress .. "/1"
  124. else
  125. percentage = progress_data.progress / condition[2]
  126. self.progress_tmp.text = progress_data.progress .. "/" .. condition[2]
  127. end
  128. self.fill_img.fillAmount = percentage
  129. self.goto_btn_obj:SetActive(progress_data.status == 0)
  130. self.receive_btn_obj:SetActive(progress_data.status == 1)
  131. self.finished_obj:SetActive(progress_data.status == 2)
  132. end
  133. end
  134. function AchieveItem:OnClickGotoBtnFunc( )
  135. local jump_tb = stringtotable(self.data.client_skip)[1]
  136. -- 不管怎样先关界面
  137. if IsTableEmpty(jump_tb) then -- 没有跳转则直接关闭角色系统界面
  138. -- GlobalEventSystem:Fire(EventName.CLOSE_NEW_MAIN_ROLE_VIEW)
  139. -- self.model:Fire(AchieveModel.OPEN_ACHIEVE_MAIN_VIEW)
  140. else
  141. if jump_tb[1] == 500 then -- 500 护送任务要关闭成就界面
  142. -- GlobalEventSystem:Fire(EventName.CLOSE_NEW_MAIN_ROLE_VIEW)
  143. -- self.model:Fire(AchieveModel.OPEN_ACHIEVE_MAIN_VIEW)
  144. DailyModel:getInstance():Fire(DailyModel.CLOSE_DAILY_BASE_VIEW)
  145. OpenFun.Open(jump_tb[1], jump_tb[2])
  146. elseif jump_tb[3] then
  147. GlobalEventSystem:Fire(EventName.OPEN_ACITVITY_TIP, jump_tb[1], jump_tb[2], true)
  148. else
  149. OpenFun.Open(jump_tb[1], jump_tb[2])
  150. end
  151. end
  152. end
  153. -- 移动到新索引的位置
  154. function AchieveItem:MoveNewIndexPosAnimAndUpdate( old_index, new_index, new_data, anim_call_back )
  155. local origin_pos = self:GetIndexPos(old_index)
  156. local move_one_index_time = 0.15
  157. -- logWarn('=======Msh:AchieveItem.lua[161]=======', self.index, new_index)
  158. local old_index = old_index
  159. local anim_call_back = anim_call_back or nil
  160. self.index = new_index -- 存一下新索引
  161. -- 动画完成后更新索引
  162. local last_func = function( )
  163. if anim_call_back then
  164. anim_call_back()
  165. end
  166. -- self.index = self.new_index
  167. -- self.new_index = nil
  168. -- self:UpdateView()
  169. -- print('Msh:AchieveItem.lua[166] data', self.data.type * 10000 + self.data.sub_type, self.index)
  170. end
  171. if new_index > old_index then -- 位置下移
  172. --print('Msh:AchieveItem.lua[177] 位置下移', data)
  173. -- 从目标索引位置右边 移动到目标索引位置
  174. local move_func1 = function( )
  175. self:SetData( new_data) -- 消失后 刷新
  176. self:PlayLineAnim(self:GetIndexPos(new_index, AchieveItem.WIDTH - 100),
  177. self:GetIndexPos(new_index),
  178. move_one_index_time,
  179. last_func)
  180. end
  181. -- 先往右移
  182. self:PlayLineAnim(origin_pos, self:GetIndexPos(old_index, AchieveItem.WIDTH - 100),
  183. move_one_index_time, move_func1)
  184. elseif old_index - new_index == 1 then -- 上移一格
  185. --print('Msh:AchieveItem.lua[190] 上移一格', data)
  186. self:SetData( new_data) -- 直接刷
  187. self:PlayLineAnim(origin_pos, self:GetIndexPos(new_index), move_one_index_time ,last_func, move_one_index_time)
  188. elseif old_index == new_index then -- 位置不变
  189. if self.data and self.data.id ~= new_data.id and
  190. self.data.sub_type == new_data.sub_type and
  191. self.data.type == new_data.type
  192. then -- 数据变更了 原地刷新
  193. --print('Msh:AchieveItem.lua[194] 位置不变 动画', data)
  194. -- 从目标索引位置右边 移动到目标索引位置
  195. local move_func1 = function( )
  196. self:SetData( new_data) -- 消失后 刷新
  197. -- 从左边 回来
  198. self:PlayLineAnim(
  199. self:GetIndexPos(new_index, - (AchieveItem.WIDTH + 100)),
  200. self:GetIndexPos(new_index),
  201. move_one_index_time,
  202. last_func)
  203. end
  204. -- 先往右移
  205. self:PlayLineAnim(origin_pos, self:GetIndexPos(old_index, AchieveItem.WIDTH - 100),
  206. move_one_index_time, move_func1)
  207. else
  208. --print('Msh:AchieveItem.lua[194] 位置不变 只刷新', data)
  209. last_func()
  210. self:SetData( new_data) -- 直接刷新
  211. end
  212. else
  213. self:SetData( new_data, new_index)
  214. last_func()
  215. -- logWarn('=======Msh:AchieveItem.lua[167]==MOVE POS IS ERROR=====')
  216. end
  217. end
  218. -- 移动到目标位置
  219. function AchieveItem:PlayLineAnim( start_pos, end_pos, anim_time, end_func, delay_time )
  220. self:SetPosition(start_pos.x, start_pos.y, start_pos.z)
  221. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.transform)
  222. local anim_time = anim_time or 0.2
  223. local delay_time = delay_time or 0
  224. -- 延迟
  225. local action1 = cc.DelayTime.New( delay_time )
  226. -- 位移
  227. local function move_func( percent )
  228. SetLocalPosition(self.transform, start_pos.x + (end_pos.x - start_pos.x) * percent,
  229. start_pos.y + (end_pos.y - start_pos.y) * percent, 0)
  230. end
  231. local action2 = cc.CustomUpdate.New(anim_time, move_func)
  232. -- 回调
  233. local function callback_1()
  234. if end_func then
  235. end_func()
  236. end
  237. end
  238. local call_func_1 = cc.CallFunc.New(callback_1)
  239. local action10 = cc.Sequence.New( action1, action2, call_func_1 )
  240. self:AddAction(action10, self.transform)
  241. end
  242. function AchieveItem:GetIndexPos( index, offset_x )
  243. local offset_x = offset_x or 0
  244. return Vector3(offset_x, AchieveItem.START_Y - (index-1) * (AchieveItem.HEIGHT + AchieveItem.SPACE_Y), 0)
  245. end
  246. function AchieveItem:SetIndexPos( index )
  247. local pos = self:GetIndexPos( index )
  248. self:SetPosition(pos.x, pos.y, pos.z)
  249. end
  250. -- 停止当前动画
  251. function AchieveItem:StopAnim( )
  252. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.transform)
  253. if self.index then
  254. local pos = self:GetIndexPos(self.index)
  255. self:SetPosition(pos.x, pos.y)
  256. end
  257. end
  258. function AchieveItem:__delete( )
  259. for i,item in pairs(self.awardItem_list) do
  260. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, item)
  261. end
  262. self.awardItem_list = {}
  263. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.transform)
  264. end