源战役客户端
Não pode escolher mais do que 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.

330 linhas
13 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 藏宝图系统:高级藏宝图抽奖界面
  4. -- *>
  5. TreasureMapAdvanceRollView = TreasureMapAdvanceRollView or BaseClass(BaseView)
  6. local TreasureMapAdvanceRollView = TreasureMapAdvanceRollView
  7. local cos = math.cos
  8. local sin = math.sin
  9. local rad = math.rad
  10. local deg = math.deg
  11. local Quaternion = Quaternion
  12. local TweenFunc = TweenFunc
  13. local ClampAngleType2 = ClampAngleType2
  14. function TreasureMapAdvanceRollView:__init()
  15. self.base_file = "treasureMap"
  16. self.layout_file = "TreasureMapAdvanceRollView"
  17. self.layer_name = "UI"
  18. self.destroy_imm = true
  19. self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置
  20. self.hide_maincancas = false --全屏界面需要隐藏主UI
  21. self.change_scene_close = true --是否切换场景时关闭(弹出界面使用)
  22. self.auto_close_time = 10
  23. self.model = TreasureMapModel:getInstance()
  24. self.item_pos_radius = 190 -- 抽奖节点分布在容器内的分布半径
  25. self.roll_item_list = {}
  26. self.load_callback = function ()
  27. self:LoadSuccess()
  28. self:AddEvent()
  29. end
  30. self.open_callback = function ( )
  31. self:UpdateView()
  32. end
  33. self.destroy_callback = function ( )
  34. self:DestroySuccess()
  35. self.model._tm_can_fly_goods = true -- 解除道具飞入表现限制
  36. end
  37. end
  38. function TreasureMapAdvanceRollView:Open(vo)
  39. self.result_data = vo
  40. BaseView.Open(self)
  41. end
  42. function TreasureMapAdvanceRollView:LoadSuccess()
  43. local nodes = {
  44. "adv_role:raw", "bg:raw", -- 背景图相关
  45. "item_con", -- 奖励节点
  46. "selected:obj",
  47. "close_btn:obj",
  48. "pro_fill:img", "feedback_btn:obj", "feedback_red:obj",
  49. "pin",
  50. "roll_btn:obj:img", "roll_btn/roll_btn_lb:tmp",
  51. "preview_btn:obj",
  52. "tip_bg:obj", "tip_lb:tmp",
  53. }
  54. self:GetChildren(nodes)
  55. -- 暂时屏蔽再次使用高级藏宝图的按钮
  56. self.roll_btn_img.raycastTarget = false
  57. -- 加载背景图
  58. lua_resM:setOutsideRawImage(self, self.adv_role_raw, GameResPath.GetRoleBg("tm_adv_role_336_608"), false)
  59. lua_resM:setOutsideRawImage(self, self.bg_raw, GameResPath.GetViewBigBg("tm_adv_bg"), false)
  60. end
  61. function TreasureMapAdvanceRollView:AddEvent()
  62. local function click_event(target)
  63. if target == self.close_btn_obj then -- 关闭界面
  64. self.model._check_tm_tips = TreasureMapConst.Advance
  65. self:Close()
  66. elseif target == self.roll_btn_obj then -- 再次摇奖(重新开始高级藏宝图寻宝)
  67. self:OnRollBtnClicked()
  68. elseif target == self.preview_btn_obj then -- 查看奖励预览
  69. self.model:Fire(TreasureMapConst.OPEN_REWARD_PERVIEW_VIEW, true, TreasureMapConst.Advance)
  70. elseif target == self.feedback_btn_obj then -- 查看遗宝界面(月度次数奖励)
  71. self.model:Fire(TreasureMapConst.OPEN_FEEDBACK_VIEW, true)
  72. end
  73. end
  74. AddClickEvent(self.close_btn_obj, click_event)
  75. AddClickEvent(self.roll_btn_obj, click_event)
  76. AddClickEvent(self.preview_btn_obj, click_event)
  77. AddClickEvent(self.feedback_btn_obj, click_event)
  78. local function updateFeedbackRed(red_type)
  79. if red_type and red_type == TreasureMapConst.RedType.MonthReward then
  80. self:UpdateFeedbackRed()
  81. end
  82. end
  83. self:BindEvent(self.model, TreasureMapConst.UPDATE_TREASUREMAP_RED, updateFeedbackRed)
  84. local function updateMonthTimesData()
  85. self:UpdateMonthTimesData()
  86. end
  87. self:BindEvent(self.model, TreasureMapConst.UPDATE_MONTH_TIMES_DATA, updateMonthTimesData)
  88. end
  89. function TreasureMapAdvanceRollView:UpdateView()
  90. self:UpdateMonthTimesData()
  91. self:UpdateRewardItems()
  92. self:StartRollItemAnim()
  93. self:UpdateFeedbackRed()
  94. end
  95. -- 更新界面基础数据
  96. function TreasureMapAdvanceRollView:UpdateMonthTimesData( )
  97. -- 更新遗宝进度
  98. local momth_times_data = self.model:GetAdvTreasureMapMonthTimesData()
  99. local month_times_reward_cfg = self.model:GetTreasureMapMonthTimesRewardCfg()
  100. local percentage = 0
  101. if momth_times_data and month_times_reward_cfg then
  102. local times = momth_times_data.times
  103. local cfg_num = #month_times_reward_cfg
  104. local v = nil
  105. for k = 1, cfg_num do
  106. v = month_times_reward_cfg[k]
  107. -- 满足了本次的领取条件但 未领取,或者超过了最高档位所需次数
  108. if v[1] <= times and (not momth_times_data.receive_list[v[1]] or k == cfg_num) then
  109. percentage = 1
  110. break
  111. end
  112. if v[1] > times then -- 这个档位的次数都没有满足,就获取百分比
  113. percentage = times / v[1]
  114. break
  115. end
  116. end
  117. end
  118. self.pro_fill_img.fillAmount = percentage
  119. self:FeedbackBtnAction(percentage >= 1)
  120. end
  121. function TreasureMapAdvanceRollView:FeedbackBtnAction(show)
  122. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.feedback_btn)
  123. if show then
  124. local action1 = cc.ScaleTo.New(0.3, 0.95, 0.95, 0.95)
  125. local action2 = cc.ScaleTo.New(0.3, 1.05, 1.05, 1.05)
  126. local action = cc.RepeatForever.New(cc.Sequence.New(action1, action2))
  127. cc.ActionManager:getInstance():addAction(action, self.feedback_btn)
  128. else
  129. SetLocalScale(self.feedback_btn, 1, 1, 1)
  130. end
  131. end
  132. -- 创建奖励道具
  133. function TreasureMapAdvanceRollView:UpdateRewardItems( )
  134. self.reward_item_data = self.model:GetRollRewardItemData(self.result_data)
  135. -- self.target_index = target_index
  136. local item_num = TableSize(self.reward_item_data)
  137. local angle_offset = 360 / item_num
  138. local start_angle = 90 - angle_offset/2
  139. local rad_start_angle
  140. local item
  141. for k, v in ipairs(self.reward_item_data) do
  142. item = self.roll_item_list[k]
  143. if not item then
  144. item = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self.item_con)
  145. item:SetItemSize(78, 78)
  146. self.roll_item_list[k] = item
  147. end
  148. item:SetVisible(true)
  149. rad_start_angle = rad(start_angle)
  150. -- 坐标设置:y正向为起点顺时针分布
  151. item:SetAnchoredPosition(self.item_pos_radius * cos(rad_start_angle) + 280 - 39, self.item_pos_radius * sin(rad_start_angle) - 280 + 39)
  152. local reward_data = stringtotable(v.rewards)[1]
  153. local typeId, lock = GoodsModel:getInstance():GetMappingTypeId(reward_data[1], reward_data[2])
  154. item:SetData(typeId, reward_data[3], nil, nil, lock)
  155. item._angle = start_angle
  156. -- 变换角度
  157. start_angle = ClampAngleType2(start_angle - angle_offset)
  158. end
  159. end
  160. -- 开始抽奖动画
  161. function TreasureMapAdvanceRollView:StartRollItemAnim()
  162. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.pin)
  163. local angel = self:AnimRotateAngle()
  164. local anim_end_fun = function()
  165. self.is_animating = false
  166. self.selected_obj:SetActive(true)
  167. local selected_angel = math.ceil(angel / 36) * 36
  168. self.selected.localRotation = Quaternion.Euler(0, 0, selected_angel)
  169. self:ShowGetReward()
  170. self:AutoCloseTimer()
  171. -- self.roll_btn_lb_tmp.text = "再次寻宝"
  172. end
  173. local start_angel = self.pin.localEulerAngles.z
  174. start_angel = ClampAngleType2(start_angel)
  175. self.selected_obj:SetActive(false)
  176. -- local selected_angel = self.selected.localEulerAngles.z
  177. -- 播放动画
  178. local pin_action_callback = function(percent)
  179. local ratio = self:AnimPercentageAmount(percent)
  180. local temp_angle = angel * ratio
  181. local temp_angle2 = start_angel * (1-ratio)
  182. self.pin.localRotation = Quaternion.Euler(0, 0, temp_angle2 + temp_angle)
  183. -- 更新选中节点的旋转角度
  184. -- local temp_spin_angel = ClampAngleType2(temp_angle2 + temp_angle)
  185. -- temp_spin_angel = math.ceil(temp_spin_angel / 36) * 36
  186. -- if temp_spin_angel ~= selected_angel then
  187. -- selected_angel = temp_spin_angel
  188. -- self.selected.localRotation = Quaternion.Euler(0, 0, selected_angel)
  189. -- end
  190. end
  191. local anim_time = self.model:GetTreasureMapKvCfg("advanced_map_speed").value
  192. local spin_action = cc.CustomUpdate.New(anim_time, pin_action_callback)
  193. spin_action = cc.Sequence.New(spin_action, cc.CallFunc.New(anim_end_fun))
  194. cc.ActionManager:getInstance():addAction(spin_action, self.pin)
  195. -- 修改文本
  196. self.roll_btn_lb_tmp.text = "挖宝中..."
  197. self.is_animating = true
  198. -- 清掉藏宝图数据
  199. self.model:SetCurrentTreasureData(nil)
  200. end
  201. function TreasureMapAdvanceRollView:AnimPercentageAmount(ratio)
  202. local div = TreasureMapConst.SpeedUpRatio
  203. if ratio < div then
  204. return div * TweenFunc.easeInQuint(ratio/div)
  205. else
  206. return (1-div) * TweenFunc.easeOutQuint((ratio-div)/(1-div)) + div
  207. end
  208. end
  209. -- 获取抽中道具所在的角度,并推算出一个n圈的终点角度
  210. function TreasureMapAdvanceRollView:AnimRotateAngle()
  211. local target_angle
  212. self.target_index = 1
  213. for k, v in ipairs(self.roll_item_list) do
  214. if self.reward_item_data[k].reward_id == self.result_data.reward_id then -- 获取抽中档位所在的节点的角度,并做一个减少90度的偏移,求得旋转指针最后的角度
  215. self.target_index = k
  216. target_angle = v._angle - 90
  217. break
  218. end
  219. end
  220. -- print("Saber:TreasureMapAdvanceRollView [204] self.target_index: ",self.target_index)
  221. target_angle = target_angle + math.random(-15, 15) -- 在节点范围内进行一个合理的偏移
  222. -- 起始角度必须先将指针的角度归零
  223. -- 默认转10圈,然后停在目标角度范围内
  224. local angle = TreasureMapConst.AnimRollTime * -360 + target_angle
  225. return angle
  226. end
  227. -- 展示获得道具的表现
  228. function TreasureMapAdvanceRollView:ShowGetReward( )
  229. --触发快捷使用
  230. OperateActivityModel:getInstance():Fire(OperateActivityModel.QUIK_USE, true)
  231. --道具飞背包
  232. local goods_data = stringtotable(self.reward_item_data[self.target_index].rewards)[1]
  233. local goods_Id, lock = GoodsModel:getInstance():GetMappingTypeId(goods_data[1] , goods_data[2])
  234. local goods_fly_data = {[1] = goods_Id}
  235. if TableSize(goods_fly_data) > 0 then
  236. MainUIModel:getInstance():PlayGoodsFlyList(goods_fly_data)
  237. end
  238. --飘字
  239. local goods_fly_data = {
  240. [1] = {
  241. goods_type_id = goods_Id,
  242. num = goods_data[3],
  243. }
  244. }
  245. if TableSize(goods_fly_data) > 0 then
  246. MainUIModel:getInstance():AddFloatInfo(goods_fly_data, true)
  247. end
  248. end
  249. function TreasureMapAdvanceRollView:UpdateFeedbackRed( )
  250. self.feedback_red_obj:SetActive(self.model:GetTreasureMapRed(TreasureMapConst.RedType.MonthReward))
  251. end
  252. function TreasureMapAdvanceRollView:AutoCloseTimer( )
  253. local end_time = TimeUtil:getServerTime() + self.auto_close_time
  254. local function auto_close_time_func()
  255. local left_time = end_time - TimeUtil:getServerTime()
  256. if left_time > 0 then
  257. self.roll_btn_lb_tmp.text = string.format("%s 秒后自动关闭", left_time)
  258. else
  259. self.model._check_tm_tips = TreasureMapConst.Advance
  260. self:Close()
  261. end
  262. end
  263. auto_close_time_func()
  264. self:ClearAutoCloseTimer()
  265. self.auto_close_time_func_id = GlobalTimerQuest:AddPeriodQuest(auto_close_time_func, 0.5, -1)
  266. end
  267. function TreasureMapAdvanceRollView:ClearAutoCloseTimer( )
  268. if self.auto_close_time_func_id then
  269. GlobalTimerQuest:CancelQuest(self.auto_close_time_func_id)
  270. self.auto_close_time_func_id = nil
  271. end
  272. end
  273. -- 再次摇奖按钮
  274. function TreasureMapAdvanceRollView:OnRollBtnClicked( )
  275. if self.is_animating then
  276. Message.show("挖宝中...", "fault")
  277. return
  278. end
  279. local goods_id = TreasureMapConst.GoodId[TreasureMapConst.Advance]
  280. local left_goods_num = GoodsModel:getInstance():GetTypeGoodsNum(goods_id)
  281. if left_goods_num <= 0 then -- 提示购买高级藏宝图
  282. self.model:BuyTreasureMapItemFunc(TreasureMapConst.Advance)
  283. -- ShopModel:getInstance():Fire(ShopModel.OPEN_SHOP_BUY_TIP_VIEW, goods_id, 1)
  284. else
  285. local function ok( ... )
  286. self.model._check_tm_tips = false
  287. self:Close()
  288. self.model:Fire(TreasureMapConst.REQUEST_CCMD_EVENT, 42401, TreasureMapConst.Advance)
  289. end
  290. local ask_str = "是否再次进行高级寻宝?"
  291. Alert.show(ask_str,Alert.Type.Two,ok,nil,"确定","取消")
  292. end
  293. end
  294. function TreasureMapAdvanceRollView:DestroySuccess( )
  295. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.feedback_btn)
  296. if self.is_animating then
  297. self:ShowGetReward()
  298. end
  299. cc.ActionManager:getInstance():addAction(spin_action, self.pin)
  300. for k, v in pairs(self.roll_item_list) do
  301. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, v)
  302. end
  303. self:ClearAutoCloseTimer()
  304. self.roll_item_list = nil
  305. self.model:CheckTreasureTipUseViewOpen()
  306. end