源战役客户端
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.

382 lines
17 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 成就总览界面
  4. -- *>
  5. AchieveTotalView = AchieveTotalView or BaseClass(BaseItem)
  6. local AchieveTotalView = AchieveTotalView
  7. function AchieveTotalView:__init(parent_wnd,prefab_asset,layer_name)
  8. self.base_file = "achievement"
  9. self.layout_file = "AchieveTotalView"
  10. self.parent_wnd = parent_wnd
  11. self.layer_name = layer_name
  12. self.cur_attr_item = {} -- 当前成就等级属性节点
  13. self.next_attr_item = {} -- 下一级成就等级属性节点
  14. self.privilege_item = {} -- 成就特权item列表
  15. self.achieve_lv_data = nil -- 成就等级数据
  16. self.cur_achieve_lv = -1 -- 当前成就等级
  17. self.cur_privilege_lv = 0 -- 当前成就特权等级
  18. self.cur_privilege_stage = false -- 当前查看的成就特权等级对应的成就等级
  19. self.cur_show_privilege_index = 1 -- 当前展示的成就特权信息index
  20. self.is_exchange_index = false -- 当前处于交换交易券的页签
  21. self.is_weekly_reward_index = false -- 当前处于周奖励的页签
  22. self.privilege_awardItem = nil -- 成就特权奖励item
  23. self.mainVo = RoleManager.Instance.mainRoleInfo
  24. self.model = AchieveModel:getInstance()
  25. self.privilege_data = self.model:GetAchievePrivilegeTabData() -- 获取特权按钮数据
  26. self.first_init = true
  27. self:Load()
  28. end
  29. function AchieveTotalView:Load_callback()
  30. local nodes = {
  31. "bg:raw", -- 背景图
  32. -- "power_bg",
  33. "power:txt", -- 战力相关
  34. "ques_btn:obj",
  35. "levelImg_con/lv_one:obj:img", "levelImg_con/lv_ten:obj:img", "levelImg_con/lv_hundred:obj:img", -- 成就等级相关
  36. "achi_exp_fill:img", "achi_exp:tmp", -- 成就等级经验值
  37. "next_attr_con", "cur_attr_con:obj", -- 成就等级属性容器
  38. "privilege_scroll", "privilege_scroll/Viewport/privilege_con", -- 特权节点滚动容器
  39. "privilege_con1:obj", -- 特权奖励节点类型1
  40. "privilege_con1/privilege_receiveBtn:obj:imgex", -- 领取特权奖励
  41. "privilege_con1/privilege_receiveBtn/privilege_receive_red:obj",
  42. --"privilege_con1/privilege_receiveBtn/privilege_receiveBtn_txt:tmp",
  43. "privilege_con1/privilege_reward_con", -- 特权奖励容器
  44. "privilege_con2:obj", -- 特权奖励节点类型2
  45. "privilege_con2/privilege_exchange1", "privilege_con2/privilege_exchange2",
  46. "privilege_con2/privilege_exchangeBtn:obj:imgex",
  47. "privilege_con2/privilege_exchangeBtn/privilege_exchange_red:obj",
  48. "privilege_con2/privilege_exchange_tip:tmp",
  49. "privilege_con2/privilege_exchangeBtn/privilege_exchangeBtn_txt:tmp",
  50. "privilege_desc:tmp", "privilege_name:tmp", -- 特权说明相关
  51. "privilege_scroll/Viewport/privilege_con/privilege_progress_bg/privilege_fill:img", -- 特权进度相关
  52. "privilege_scroll/Viewport/privilege_con/privilege_progress_bg",
  53. "privilegeIcon:img", "privilegeBtn:obj",
  54. "rightArrow:obj", "leftArrow:obj",
  55. "achi_lv:tmp",
  56. }
  57. self:GetChildren(nodes)
  58. -- 特权领取按钮文本
  59. self.privilege_receive_flag = self:GetChild("privilege_con1/privilege_receiveBtn/Text"):GetComponent("TextMeshProUGUI")
  60. lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetAchieveBigPic("achi_total_bg_571_704"), true)
  61. self:AddEvents()
  62. self:UpdateView()
  63. end
  64. function AchieveTotalView:AddEvents( )
  65. local function click_event(target)
  66. if target == self.privilege_receiveBtn_obj then -- 特权奖励领取
  67. if not self.cur_privilege_stage then return end
  68. self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40908, self.cur_privilege_stage)
  69. elseif target == self.privilege_exchangeBtn_obj then -- 特权交易券兑换
  70. self.model:Fire(AchieveModel.REQUEST_CCMD_EVENT, 40911)
  71. elseif target == self.ques_btn_obj then -- 成就系统介绍
  72. GlobalEventSystem:Fire(EventName.OPEN_INSTRUCTION_VIEW, 409)
  73. elseif target == self.privilegeBtn_obj then -- 特权详情
  74. self.model:Fire(AchieveModel.OPEN_ACHIEVE_PRIVILEGE_VIEW, true)
  75. elseif target == self.rightArrow_obj then -- 特权详情
  76. self:ChangePrivilegeIndex(1)
  77. elseif target == self.leftArrow_obj then -- 特权详情
  78. self:ChangePrivilegeIndex(-1)
  79. end
  80. end
  81. AddClickEvent(self.privilege_receiveBtn_obj, click_event)
  82. AddClickEvent(self.privilege_exchangeBtn_obj, click_event)
  83. AddClickEvent(self.ques_btn_obj, click_event)
  84. AddClickEvent(self.privilegeBtn_obj, click_event)
  85. AddClickEvent(self.rightArrow_obj, click_event)
  86. AddClickEvent(self.leftArrow_obj, click_event)
  87. local function update_achieve_lvdata()
  88. self:UpdateLevelInfo()
  89. self:UpdatePrivilegeExp()
  90. end
  91. self:BindEvent(self.model, AchieveModel.UPDATE_ACHIEVE_LV_DATA, update_achieve_lvdata)
  92. local function update_privilege_reward_status()
  93. self:UpdateSelectPrivilegeIndex( )
  94. end
  95. self:BindEvent(self.model, AchieveModel.UPDATE_PRIVILEGE_REWARD_STATUS, update_privilege_reward_status)
  96. local function update_privilege_red(type)
  97. if type == AchieveModelRedType.Privilege
  98. or type == AchieveModelRedType.Exchange
  99. or type == AchieveModelRedType.Weekly then
  100. self:UpdatePrivilegeData()
  101. end
  102. end
  103. self:BindEvent(self.model, AchieveModel.UPDATE_ACHIEVE_RED, update_privilege_red)
  104. end
  105. function AchieveTotalView:UpdateView( )
  106. self:UpdateLevelInfo()
  107. -- self:UpdatePrivilegeItem()
  108. -- 初始化时默认选中最新的当前特权
  109. -- local cur_level = self.cur_achieve_lv
  110. local index = self.model:GetCanGetPrivilegeStage( )
  111. self.cur_show_privilege_index = index
  112. -- 刷新特权
  113. self:ChangePrivilegeIndex(0, true)
  114. end
  115. function AchieveTotalView:UpdateSelectPrivilegeIndex( )
  116. local index = self.model:GetCanGetPrivilegeStage( )
  117. self.cur_show_privilege_index = index
  118. -- 刷新特权
  119. self:ChangePrivilegeIndex(0, true)
  120. end
  121. -- 更改特权索引
  122. function AchieveTotalView:ChangePrivilegeIndex( change_index, force_update )
  123. local old_index = self.cur_show_privilege_index
  124. self.cur_show_privilege_index = self.cur_show_privilege_index + change_index
  125. self.cur_show_privilege_index = Mathf.Clamp(self.cur_show_privilege_index, 1, #self.privilege_data)
  126. if force_update or old_index ~= self.cur_show_privilege_index then
  127. self:UpdatePrivilegeData(self.cur_show_privilege_index)
  128. self.leftArrow_obj:SetActive(self.cur_show_privilege_index ~= 1)
  129. self.rightArrow_obj:SetActive(self.cur_show_privilege_index ~= #self.privilege_data)
  130. end
  131. end
  132. -- 更新等级相关数据 force 强制刷新等级和属性条目
  133. function AchieveTotalView:UpdateLevelInfo()
  134. self.achieve_lv_data = self.model:GetAchieveLvData()
  135. if self.achieve_lv_data and self.achieve_lv_data.lv then
  136. -- 设置当前成就经验值表现
  137. local max_lv = TableSize(Config.Achievementstage) - 1
  138. local key_lv = self.achieve_lv_data.lv >= max_lv and max_lv or self.achieve_lv_data.lv + 1
  139. local lv_cfg = Config.Achievementstage[key_lv]
  140. local is_first = self.first_init
  141. -- 完成经验条动画后的回调
  142. local after_exp_fill_update = function ( )
  143. -- 设置经验描述
  144. self.achi_exp_tmp.text = self.achieve_lv_data.lv < max_lv
  145. and string.format("%s/%s", self.achieve_lv_data.exp, lv_cfg.need_exp)
  146. or "MAX"
  147. -- 升级后才刷新的一些UI
  148. if self.achieve_lv_data.lv ~= self.cur_achieve_lv then
  149. self.cur_achieve_lv = self.achieve_lv_data.lv
  150. self.achi_lv_tmp.text = string.format('Lv.%s', self.cur_achieve_lv)
  151. -- self:UpdateAchieveLevel(self.cur_achieve_lv)
  152. self:UpdateLevelAttrItem(self.cur_achieve_lv)
  153. self:UpdatePrivilegeExp() -- 升级也要更新特权的进度
  154. self:UpdateSelectPrivilegeIndex( )
  155. -- 升级特效
  156. if not is_first then
  157. self:AddUIEffect("ui_hunliqiudianliang", self.privilegeIcon, "UI", nil, 5, false, nil,nil,nil,nil,1)
  158. end
  159. -- 特权图标
  160. local index = self.model:GetCurPrivilegeStage( )
  161. lua_resM:setOutsideImageSprite(self, self.privilegeIcon_img,
  162. GameResPath.GetAchieveBigPic("achi_privilege_icon1"), true)
  163. SetLocalScale(self.privilegeIcon, 1.4, 1.4, 1)
  164. end
  165. end
  166. local new_rate = self.achieve_lv_data.lv < max_lv and (self.achieve_lv_data.exp / lv_cfg.need_exp) or 1
  167. local old_rate = tonumber(self.achi_exp_fill_img.fillAmount)
  168. local old_lv = self.cur_achieve_lv
  169. local new_lv = self.achieve_lv_data.lv
  170. if not self.first_init then
  171. local need_time
  172. local need_time_2
  173. local ANIM_TIME = 0.3
  174. if old_lv and old_lv < new_lv then -- 涨满再归零再涨
  175. -- 计算动画时间
  176. need_time = 1 * (1 - old_rate)
  177. need_time = need_time >= ANIM_TIME and need_time or ANIM_TIME
  178. need_time_2 = 1 * new_rate
  179. need_time_2 = need_time_2 >= ANIM_TIME and need_time_2 or ANIM_TIME
  180. local end_func = function ()
  181. self:ShowFillAmountAnim(0, new_rate, after_exp_fill_update, need_time_2 )
  182. end
  183. self:ShowFillAmountAnim( old_rate, 1, end_func, need_time )
  184. else -- 直接涨
  185. need_time = 1 * (new_rate - old_rate)
  186. need_time = need_time >= ANIM_TIME and need_time or ANIM_TIME
  187. self:ShowFillAmountAnim( old_rate, new_rate, after_exp_fill_update, need_time )
  188. end
  189. else -- 直接设置
  190. self.achi_exp_fill_img.fillAmount = new_rate
  191. after_exp_fill_update()
  192. end
  193. if self.first_init then -- 除了第一次初始化 其他刷新都要动画
  194. self.first_init = false
  195. end
  196. end
  197. end
  198. -- 进度动画 注意:new_rate > old_rate
  199. function AchieveTotalView:ShowFillAmountAnim( old_rate, new_rate, end_fun, need_time )
  200. if self.tween_slider_id then
  201. TweenLite.Stop(self.tween_slider_id)
  202. self.tween_slider_id = nil
  203. end
  204. self.achi_exp_fill_img.fillAmount = old_rate
  205. self.tween_slider_id = TweenLite.to(self, self.achi_exp_fill_img, TweenLite.UiAnimationType.FILLAMOUNT, new_rate, need_time, end_fun)
  206. end
  207. -- 更新等级对应的属性信息
  208. function AchieveTotalView:UpdateLevelAttrItem(level)
  209. local key = {
  210. [1] = "cur",
  211. [2] = "next",
  212. }
  213. local lv_data, attr_list, last_attr_list -- 等级配置,当前属性数据和上一级的属性配置
  214. local total_lv = TableSize(Config.Achievementstage) - 1
  215. local item, pos
  216. -- self.cur_attr_con_obj:SetActive(level > 0)
  217. for i = 1, 2 do -- 当前和下级属性的加载做成循环,节约代码量
  218. level = level > total_lv and total_lv or level
  219. lv_data = Config.Achievementstage[level]
  220. attr_list = lv_data and stringtotable(lv_data.attr_list) or {}
  221. local show_count = 2 -- 展示的属性个数
  222. for k, v in ipairs(attr_list) do
  223. item = self[key[i] .. "_attr_item"][k]
  224. if not item then
  225. item = AchieveTotalAttrItem.New(self[key[i] .. "_attr_con"])
  226. self[key[i] .. "_attr_item"][k] = item
  227. end
  228. item:SetVisible(true)
  229. -- item:SetAnchoredPosition((1 - k % 2) * 187, math.ceil(k / 2) * -35 + 35)
  230. item:SetAnchoredPosition((1 - k % 2) * 187, -6)
  231. item:SetData(v, last_attr_list or nil)
  232. show_count = show_count - 1
  233. if show_count <= 0 then
  234. break
  235. end
  236. end
  237. if #self[key[i] .. "_attr_item"] > #attr_list then
  238. for k = #attr_list + 1, #self[key[i] .. "_attr_item"] do
  239. self[key[i] .. "_attr_item"][k]:SetVisible(false)
  240. end
  241. end
  242. -- 等级自增一级,适应下一级属性的加载
  243. level = level + 1
  244. last_attr_list = DeepCopy(attr_list)
  245. if i == 1 then
  246. self.power_txt.text = "f" .. GetFighting(last_attr_list)
  247. -- 动态修改战力背景宽度
  248. -- local power_bg_width = self.power_txt.preferredWidth > 224 and 303 - 224 + self.power_txt.preferredWidth or 303
  249. -- SetSizeDeltaX(self.power_bg, power_bg_width)
  250. end
  251. end
  252. end
  253. function AchieveTotalView:UpdatePrivilegeExp( )
  254. -- 计算特权进度,需要根据每一级所占的百分比来逐级计算
  255. local persent = 0
  256. -- 获取当前特权等级
  257. self.cur_privilege_lv = self.model:GetAchievePrivilegeLv(self.cur_achieve_lv)
  258. if #self.privilege_data > 1 and self.cur_privilege_lv < #self.privilege_data then
  259. --每一级对应的百分比
  260. local each_lv_pec = 1/(#self.privilege_data-1)
  261. persent = each_lv_pec * (self.cur_privilege_lv - 1)
  262. --当前特权等级大于1级时
  263. --而第一个特权等级未0级,所以0→1级的进度一直为0
  264. if self.cur_privilege_lv >= 1 then
  265. --当前成就等级距离上一级特权等级要求的等级数之差
  266. local lv_difference = self.cur_achieve_lv - self.privilege_data[self.cur_privilege_lv].stage
  267. --获得下一级特权等级的等级要求与上一级之差
  268. local stage_difference = self.privilege_data[self.cur_privilege_lv + 1].stage - self.privilege_data[self.cur_privilege_lv].stage
  269. --当前特权等级与下一级的实际百分比乘以每段等级间的距离长度百分数
  270. local cur_lv_pec = lv_difference / stage_difference * each_lv_pec
  271. persent = persent + cur_lv_pec
  272. end
  273. elseif self.cur_privilege_lv == #self.privilege_data then
  274. persent = 1
  275. end
  276. self.privilege_fill_img.fillAmount = persent
  277. end
  278. function AchieveTotalView:UpdatePrivilegeData(index)
  279. index = index or self.cur_show_privilege_index
  280. local data = self.privilege_data[index]
  281. -- 加载特权基础信息
  282. self.privilege_name_tmp.text = string.format('Lv.%s %s', data.stage, Trim(data.name))
  283. self.cur_privilege_stage = data.stage
  284. self.privilege_con1_obj:SetActive(true)
  285. self.is_exchange_index = data.icon == 4
  286. self.is_weekly_reward_index = data.icon == 3
  287. -- 领取状态
  288. local progress_data, status
  289. -- if data.icon == 3 then -- 每周奖励状态
  290. -- status = self.model:GetWeeklyPrivilegeRewardStatus()
  291. -- else
  292. progress_data = self.model:GetAchievePrivilegeStatus(data.stage)
  293. status = progress_data.status and progress_data.status or 0
  294. -- end
  295. SetAnchoredPositionX(self.privilege_reward_con, 165)
  296. if not self.privilege_awardItem then
  297. self.privilege_awardItem = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.privilege_reward_con)
  298. self.privilege_awardItem:SetItemSize(62, 62)
  299. end
  300. local reward = stringtotable(data.reward)[1]
  301. self.privilege_awardItem:SetVisible(reward and true or false)
  302. if reward then
  303. local typeId, lock = GoodsModel:getInstance():GetMappingTypeId(reward[1], reward[2])
  304. self.privilege_awardItem:SetData(typeId, reward[3], nil, nil, lock)
  305. end
  306. --self.privilege_receiveBtn_imgex.gray = status ~= 1
  307. if status ~= 1 then
  308. self.privilege_receiveBtn_imgex.gray = true
  309. SetTMPSharedMaterial(self.privilege_receive_flag, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn)
  310. else
  311. self.privilege_receiveBtn_imgex.gray = false
  312. SetTMPSharedMaterial(self.privilege_receive_flag, ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn)
  313. end
  314. self.privilege_receive_flag.text = status == 2 and "已领取" or "领取"
  315. self.privilege_receive_red_obj:SetActive(status == 1)
  316. -- end
  317. end
  318. function AchieveTotalView:__delete( )
  319. for k, v in ipairs(self.cur_attr_item) do
  320. v:DeleteMe()
  321. v = nil
  322. end
  323. self.cur_attr_item = nil
  324. for k, v in ipairs(self.next_attr_item) do
  325. v:DeleteMe()
  326. v = nil
  327. end
  328. self.next_attr_item = nil
  329. for k, v in pairs(self.privilege_item) do
  330. v:DeleteMe()
  331. v = nil
  332. end
  333. self.privilege_item = nil
  334. if self.privilege_awardItem then
  335. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.privilege_awardItem)
  336. self.privilege_awardItem = nil
  337. end
  338. if self.pri_ex1_awardItem then
  339. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.pri_ex1_awardItem)
  340. self.pri_ex1_awardItem = nil
  341. end
  342. if self.pri_ex2_awardItem then
  343. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self.pri_ex2_awardItem)
  344. self.pri_ex2_awardItem = nil
  345. end
  346. if self.tween_slider_id then
  347. TweenLite.Stop(self.tween_slider_id)
  348. self.tween_slider_id = nil
  349. end
  350. self:ClearUIEffect(self.privilegeIcon)
  351. end