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

1302 line
56 KiB

  1. -- <*
  2. -- @Author: Saber
  3. -- @Description: 经验挂机 主界面
  4. -- *>
  5. ExpHangupMainView = ExpHangupMainView or BaseClass(BaseView)
  6. local ExpHangupMainView = ExpHangupMainView
  7. local ExpDunAnimConst = ExpDunAnimConst
  8. local SetAnchoredPosition = SetAnchoredPosition
  9. local TweenLite = TweenLite
  10. local SetLocalScale = SetLocalScale
  11. local cc = cc
  12. local GlobalTimerQuest = GlobalTimerQuest
  13. local math_random = math.random
  14. local Status = Status
  15. local GoodsModel = GoodsModel
  16. function ExpHangupMainView:__init()
  17. self.base_file = "expDun"
  18. self.layout_file = "ExpHangupMainView"
  19. self.layer_name = "UI"
  20. self.destroy_imm = true
  21. self.use_background = true --全屏界面默认使用这个参数,非全屏界面自行设置
  22. self.hide_maincancas = true
  23. self.append_to_ctl_queue = false
  24. -- self.blur_activity_bg = true
  25. self.use_show_anim = true
  26. self.use_hide_anim = true
  27. self:AddPreLoadList("expDun", {"ExpHangupMonModelItem"})
  28. self.model = ExpDunModel:getInstance()
  29. self.dun_model = BaseDungeonModel:getInstance()
  30. self.main_role = RoleManager.Instance.mainRoleInfo
  31. self.is_set_zdepth = true
  32. self.cur_page = 1 -- 当前选中的章节
  33. self.cur_page_index = 1 -- 当前选中的章节
  34. self.limit_page = 1 -- 限制查看的章节数
  35. self.total_pages = 0
  36. self.page_limit_lv = 0
  37. self.first_load_route = true
  38. self.route_item = {}
  39. self.expdun_route_update_func = nil
  40. -- 模型动画相关参数
  41. self.bg_roll_uvRect = self.model.main_bg_roll_uvRect
  42. self.bg_roll_back_uvRect = self.model.main_bg_roll_back_uvRect
  43. self.role_skill_list = nil -- 当前职业和性别使用的技能列表缓存
  44. self.last_anim_mon_id = nil
  45. -- 新 宝 岛
  46. self.anim_stage = 1 -- 当前动画阶段 1为移动阶段,2为战斗阶段,3为战斗结束后的奖励表现和等待阶段
  47. self.temp_stage_data = nil -- 临时动画数据资源,第一次打开界面获取,使用一次后删除
  48. self.role_ran_pos = ExpDunAnimConst.RoleRamPos
  49. self.mon_id_list = ExpDunAnimConst.AnimMonList
  50. self.role_pos_origin = Vector2(-270, 0) -- 玩家模型坐标原点
  51. self.mon_stage_data = {} -- 怪物阶段数据
  52. self.mon_model_list = nil
  53. self.has_play_effect_time = 0 -- 第几次播放终结动画
  54. self.last_slay_effect_time = Status.NowTime
  55. self.role_mod_pos_offset = nil -- 模型起点偏移
  56. self.launch_pos_offset = nil -- 发射坐标偏移
  57. self.clicked_enhance_btn = false
  58. self.load_callback = function ()
  59. self:LoadSuccess()
  60. self:AddEvent()
  61. -- lua_soundM:PlayBackgroundSound("dungeon4", LuaSoundManager.SOUND_TYPE.SCENE, true)
  62. end
  63. self.open_callback = function ( )
  64. self:UpdateView()
  65. end
  66. self.destroy_callback = function ( )
  67. self:DestroySuccess()
  68. -- --播放场景背景音乐
  69. -- local cur_scene = SceneManager:getInstance():GetSceneId()
  70. -- lua_soundM:PlayBackground(cur_scene)
  71. end
  72. end
  73. function ExpHangupMainView:Open(need_show_guide, need_show_offline_con)
  74. --self.data = data
  75. self.need_show_guide = need_show_guide
  76. self.need_show_offline_con = need_show_offline_con
  77. BaseView.Open(self)
  78. end
  79. function ExpHangupMainView:LoadSuccess()
  80. local nodes = {
  81. -- 动画相关
  82. -- 2020年6月24日新增 bullet_slay_con, 专门用来处理终结弹幕表现
  83. "anim_node",
  84. "anim_node/role_con:obj:raw",
  85. "anim_node/mon_con", "anim_node/hp_con", "anim_node/bullet_con", "anim_node/bullet_slay_con", -- (三个大小完全一样的动画节点,用来区分层级)
  86. "anim_reward_con1", "anim_reward_con2", "anim_reward_con3",
  87. -- 背景相关
  88. "anim_bg:raw", "close:obj",
  89. "anim_node/bg_roll_mask:raw",
  90. "anim_node/bg_roll_mask/bg_roll:raw",
  91. "anim_node/bg_roll_mask/bg_roll_back:raw",
  92. "help_btn:obj",
  93. "route_bg:raw",
  94. -- 其他
  95. "buy_btn:obj:imgex", -- 快速挂机购买界面按钮
  96. "buy_timer:tmp", -- 快速挂机冷却相关
  97. "reward_icon_btn:obj:img", -- 放置挂机领取按钮
  98. "hang_receive_tip:obj", -- 放置挂机奖励领取提示
  99. "challenge_btn:obj:img", -- 打开副本主入口界面
  100. "challenge_btn/challenge_lb:tmp",
  101. "sweep_btn:obj", -- 扫荡按钮
  102. "sweep_btn/sweep_lb:tmp",
  103. "sweep_btn/sweep_btn_red:obj",
  104. -- "ques_con:obj",
  105. -- "dun_name:tmp", -- 当前副本名称
  106. "eff_val:tmp", -- 副本效率
  107. "reward_icon_lb:tmp",
  108. -- 红点
  109. "challenge_btn/challenge_red:obj", "buy_btn/buy_btn_red:obj","buy_btn/buy_btn_effect", "reward_icon_btn/reward_icon_btn_red:obj",
  110. -- 2021年3月11日 第六版改动新增 合并副本进度
  111. "enhance_btn:obj",
  112. "rec_power_bg",
  113. "rec_power_bg/rec_power_icon:img",
  114. "rec_power_bg/rec_power:tmp",
  115. -- "route_scroll:scroll:cg",
  116. -- "route_scroll/Viewport/route_con", -- 路线容器
  117. "route_con:cg", -- 路线容器
  118. "award_con:obj",
  119. "arrow_left:obj",
  120. "arrow_left/arrow_left_red:img",
  121. "arrow_right:obj:img",
  122. "arrow_right/arrow_right_red:img",
  123. -- 2021年5月11日 第七版改动新增 波数排行
  124. "exp_wave_rank_btn:obj",
  125. -- 2021年7月8日新增 追加章节查看限制
  126. "route_limit_bg:obj",
  127. "route_limit_bg/route_limit_icon",
  128. "route_limit_bg/route_limit_lb:tmp",
  129. --buff相关
  130. "buffText:tmp:obj", "buffImg:obj",
  131. }
  132. self:GetChildren(nodes)
  133. SetAnchoredPositionX(self.role_con, 9999) -- 加载模型前移出屏幕外
  134. local mask_x, mask_y = GetSizeDeltaXY(self.bg_roll_mask)
  135. SetSizeDelta(self.bg_roll_mask, mask_x * 0.99, mask_y * 0.99)
  136. for i = 1, 3 do
  137. self["award_item" .. i] = UIObjPool:getInstance():PopItem(UIObjPool.UIType.AwardItem, self["anim_reward_con" .. i])
  138. self["award_item" .. i]:SetAnchoredPosition(0, 0)
  139. self["award_item" .. i]:SetItemSize(59, 59)
  140. self["award_item" .. i]:SetVisible(false)
  141. self["award_item" .. i]:SetData(100007)
  142. end
  143. lua_resM:setOutsideRawImage(self, self.anim_bg_raw, GameResPath.GetViewBigBg("exp_anim_bg"))
  144. lua_resM:setOutsideRawImage(self, self.route_bg_raw, GameResPath.GetViewBigBg("exp_route_bg"))
  145. -- self.bg_roll_mask_raw.color = Color(1, 1, 1, 1 / 255)
  146. -- lua_resM:setOutsideRawImage(self, self.bg_roll_mask_raw, GameResPath.GetViewBigBg("expDun_anim_mask"))
  147. -- local function bg_roll_callback()
  148. -- self.bg_roll_raw.uvRect = self.bg_roll_uvRect
  149. -- end
  150. -- lua_resM:setOutsideRawImage(self, self.bg_roll_raw, GameResPath.GetViewBigBg("expDun_rollBg_1446_558"), false, bg_roll_callback)
  151. -- self.route_con_cg.alpha = 1
  152. self:AddToStageHandler()
  153. local buff_kind = OperateActivityModel.MaterialSubmitBuffKind.ADVENTURE_EXP_UP--触发加成后,玩家每分钟放置冒险经验收益提升100%(增对初始数值计算)
  154. local buff_cfg,buff_info = OperateActivityModel:getInstance():GetMaterialBuffInfoByKind(buff_kind)
  155. local buff_str = ""
  156. -- buff_info = {etime = TimeUtil:getServerTime( )+300}
  157. -- buff_cfg = {data = 100}
  158. self.add_buff_exp_str = ""
  159. if buff_cfg and buff_info then
  160. local sec = buff_info.etime - TimeUtil:getServerTime( )
  161. if sec > 0 then
  162. self.buffText_tmp.text = "放置倍速 生效期间生效期间提升效率<color=#2cf89a>"
  163. self.add_buff_exp_str = HtmlColorTxt("+"..buff_cfg.data.."%", ColorUtil.ORANGE_DARK)
  164. self.buffImg_obj:SetActive(true)
  165. else
  166. self.buffText_tmp.text = ""
  167. self.buffImg_obj:SetActive(false)
  168. end
  169. else
  170. self.buffText_tmp.text = ""
  171. self.buffImg_obj:SetActive(false)
  172. end
  173. if self.need_show_guide then --打开界面强制播放聚焦特效
  174. self:AddUIEffect("ui_jujiaodianji", self.challenge_btn, self.layer_name, nil, 1, true)
  175. end
  176. if OperateActivityModel:getInstance().boss_drop_act then --打开界面强制播放聚焦特效
  177. self:AddUIEffect("ui_jujiaodianji", self.buy_btn_effect, self.layer_name, nil, 1, true)
  178. end
  179. end
  180. function ExpHangupMainView:AddEvent()
  181. local function click_event(target, x, y)
  182. if target == self.close_obj then
  183. self:Close()
  184. elseif target == self.sweep_btn_obj then -- 扫荡
  185. self.dun_model:Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61130)
  186. elseif target == self.challenge_btn_obj then -- 打开副本主入口界面
  187. -- self.model:Fire(ExpDunModel.OPEN_EXP_DUN_MAIN_VIEW, true)
  188. -- local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_EXP_DUNGEON,3)
  189. -- if helpVo then
  190. -- GlobalEventSystem:Fire(EventName.FINISH_CURRENT_HELP_STEP,helpVo)
  191. -- end
  192. if self.expdun_can_enter_flag then
  193. self.dun_model:Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61001, BaseDungeonModel.EXP_DUN_ID)
  194. else
  195. Message.show("未达到挑战要求,请提升后再来吧~", "fault")
  196. end
  197. -- self.model:Fire(ExpDunModel.OPEN_EXP_HANGUP_MAIN_VIEW, false)
  198. -- self:Close()
  199. elseif target == self.reward_icon_btn_obj then -- 挂机奖励领取
  200. -- local condition = Config.Modulesub["610@16"].open_lv
  201. -- local lv = self.main_role.level
  202. -- if condition > lv then
  203. -- local str = string.format("%s级开放", condition)
  204. -- Message.show(str, "fault")
  205. -- else
  206. -- self.dun_model:Fire(BaseDungeonModel.REQUEST_CCMD_EVENT, 61050, 0, 0)
  207. -- end
  208. self.model:Fire(ExpDunModel.CHECK_OPEN_HANGUP_RECEIVE_VIEW)
  209. elseif target == self.help_btn_obj then -- 挂机玩法查询
  210. GlobalEventSystem:Fire(EventName.OPEN_INSTRUCTION_VIEW, "610@2")
  211. elseif target == self.buy_btn_obj then -- 快速挂机按钮
  212. OperateActivityModel:getInstance().boss_drop_act = false
  213. self:ClearUIEffect(self.buy_btn_effect)
  214. -- 2020年3月28日新增 快速挂机区分等级开放
  215. local condition = Config.Modulesub["610@15"].open_lv
  216. local lv = self.main_role.level
  217. if condition > lv then
  218. local str = string.format("%s级开放", condition)
  219. Message.show(str, "fault")
  220. else
  221. self.model:Fire(ExpDunModel.OPEN_QUICK_HANGUP_VIEW, true)
  222. end
  223. elseif target == self.arrow_right_obj then
  224. -- 追加限制,限制页码后不可以查看后续章节
  225. local target_page_index = self.limit_page < self.total_pages and self.limit_page or self.total_pages
  226. if self.cur_page_index + 1 <= target_page_index then
  227. self:ScrollToTargetPage(self.cur_page_index + 1)
  228. else
  229. Message.show("解锁当前章节后可浏览", "fault")
  230. end
  231. elseif target == self.arrow_left_obj then
  232. if self.cur_page_index - 1 > 0 then
  233. self:ScrollToTargetPage(self.cur_page_index - 1)
  234. end
  235. elseif target == self.enhance_btn_obj then -- 提升按钮,点击弹出引导
  236. if not self.clicked_enhance_btn then
  237. self.clicked_enhance_btn = true
  238. self:AddUIEffect("ui_jujiaodianji", self.challenge_btn, self.layer_name, nil, 1, true)
  239. end
  240. elseif target == self.exp_wave_rank_btn_obj then -- 波数排行界面
  241. self.model:Fire(ExpDunModel.OPEN_WAVE_RANK_VIEW, true)
  242. elseif target == self.buffText_obj then -- buff相关
  243. local buff_kind = OperateActivityModel.MaterialSubmitBuffKind.ADVENTURE_EXP_UP --伤害结算计算BUFF加成,对BOSS伤害提高10%,BOSS对人物伤害降低10%
  244. local buff_cfg,buff_info,dot = OperateActivityModel:getInstance():GetMaterialBuffInfoByKind(buff_kind)
  245. if buff_cfg and buff_info then
  246. local abs_pos = target.transform:TransformPoint(Vector3.zero)
  247. local sub_type = CustomActivityModel:getInstance():getActMinSubType(CustomActivityModel.CustomActBaseType.MATERIAL_SUBMIT)
  248. local act_list = CustomActivityModel:getInstance():getActList(CustomActivityModel.CustomActBaseType.MATERIAL_SUBMIT, sub_type)
  249. if act_list then
  250. local buff_data = nil
  251. for k,v in pairs(act_list.condition_list) do--[{role_lv,80},{sub,1},{cost,30},{group,5}]
  252. if v[1] == "suit" then--全服进度套件ID
  253. buff_data = OperateActivityModel:getInstance():GetMaterialSubmitServerCfg(tonumber(v[2]),dot)
  254. break
  255. end
  256. end
  257. if buff_data then
  258. local data = {
  259. sub_type = sub_type,
  260. buff_data = buff_data,
  261. pos_x = abs_pos.x,
  262. pos_y = abs_pos.y,
  263. is_outside = true,
  264. }
  265. OperateActivityModel:getInstance():Fire(OperateActivityModel.OPEN_MATERIAL_SUBMIT_BUFF_VIEW,data)
  266. end
  267. end
  268. end
  269. end
  270. end
  271. AddClickEvent(self.close_obj, click_event, LuaSoundManager.SOUND_UI.NONE)
  272. AddClickEvent(self.sweep_btn_obj, click_event)
  273. AddClickEvent(self.challenge_btn_obj, click_event)
  274. AddClickEvent(self.reward_icon_btn_obj, click_event)
  275. AddClickEvent(self.help_btn_obj, click_event)
  276. AddClickEvent(self.buy_btn_obj, click_event)
  277. AddClickEvent(self.arrow_right_obj, click_event)
  278. AddClickEvent(self.arrow_left_obj, click_event)
  279. AddClickEvent(self.enhance_btn_obj, click_event)
  280. AddClickEvent(self.exp_wave_rank_btn_obj, click_event)
  281. AddClickEvent(self.buffText_obj, click_event)
  282. -- 经验副本奖励状态的上次领取时间更新
  283. local function update_expdun_reward_icon(red_type)
  284. self:UpdateHangupRewardIconStage()
  285. end
  286. self:BindEvent(self.model, ExpDunModel.UPDATE_HANGUP_RECEIVE_TIME, update_expdun_reward_icon)
  287. -- 更新扫荡或挑战按钮状态
  288. local function update_sweep_or_challenge_status(dun_type)
  289. if dun_type and dun_type == BaseDungeonModel.DUN_TYPE.EXP then
  290. self:UpdateSweepOrChallengeStatus()
  291. end
  292. end
  293. self:BindEvent(self.dun_model, BaseDungeonModel.UPDATE_DUN_BASE_INFO, update_sweep_or_challenge_status)
  294. local function update_expdun_offline_red(red_type)
  295. if not red_type or red_type == ExpDunModel.Red_Type.Offline then
  296. self:UpdateHangupRewardIconStage()
  297. end
  298. end
  299. self:BindEvent(self.model, ExpDunModel.UPDATE_EXP_RED_BY_REDTYPE, update_expdun_offline_red)
  300. -- 当挂机效率更新时刷新一次
  301. local function on_update_hangup_ratio()
  302. self:UpdateDunWaveData()
  303. end
  304. self:BindEvent(self.model, ExpDunModel.UPDATE_HANGUP_RATIO, on_update_hangup_ratio)
  305. -- 领取玩快速挂机后刷新
  306. local function refresh_quick_hangup_timer()
  307. self:UpdateQuickHangupTimer()
  308. end
  309. self:BindEvent(self.model, ExpDunModel.UPDATE_QUICKHANGUP_DATA, refresh_quick_hangup_timer)
  310. local function update_challenge_red(red_type)
  311. if not red_type or red_type == ExpDunModel.Red_Type.Milestone then
  312. self:UpdateEffRed()
  313. end
  314. end
  315. self:BindEvent(self.model, ExpDunModel.UPDATE_EXP_RED_BY_REDTYPE, update_challenge_red)
  316. self:BindEvent(self.model, ExpDunModel.UPDATE_MAINUI_EXP_TIP, update_challenge_red) -- 追加绑定这个,用于战斗力或者波次更新的时候
  317. local function onGuideTrigger()
  318. self:AddToStageHandler()
  319. end
  320. self:BindEvent(GlobalEventSystem, EventName.TRIGGER_GUIDE_TYPE, onGuideTrigger)
  321. local function updata_buff_state(id)
  322. if id == KfActivityModel.TabID.MaterialSubmit and self.is_loaded then
  323. self:UpdateQuickHangupTimer()
  324. end
  325. end
  326. self:BindEvent(KfActivityModel:getInstance(), KfActivityModel.ANS_UPDATE_VIEW, updata_buff_state)
  327. local function show_ms_reward(ms_data, pos, index)
  328. self:ShowMsReward(ms_data, pos, index)
  329. end
  330. self:BindEvent(self.model, ExpDunModel.SHOW_MS_REWARD, show_ms_reward) -- 追加绑定这个,用于战斗力或者波次更新的时候
  331. local function on_level_up()
  332. self:UpdateExpDunEnterLvAndPowerCondition()
  333. self:UpdateMilestoneItems()
  334. end
  335. self.on_level_up_id = self.main_role:Bind(EventName.CHANGE_LEVEL, on_level_up)
  336. local function on_role_power_change()
  337. local function on_timemgr_delay_func()
  338. self:UpdateExpDunEnterLvAndPowerCondition()
  339. end
  340. TimeManager.GetInstance():StartTime("ExpHangupMainView_UpdateExpDunEnterLvAndPowerCondition", 1, on_timemgr_delay_func)
  341. end
  342. self.on_role_power_change_id = self.main_role:BindOne("fighting", on_role_power_change)
  343. end
  344. function ExpHangupMainView:CancelHide()
  345. BaseView.CancelHide(self)
  346. if self.is_loaded then
  347. self:UpdateRoleModel()
  348. end
  349. end
  350. function ExpHangupMainView:UpdateView()
  351. self:UpdateDunWaveData()
  352. self:UpdateSweepOrChallengeStatus()
  353. self:UpdateExpDunEnterLvAndPowerCondition()
  354. self:UpdateHangupRewardIconStage()
  355. self:UpdateQuickHangupTimer()
  356. self:UpdateEffRed()
  357. self:UpdateMilestoneItems(true)
  358. -- 动画相关
  359. self:StartBgRollAnim() -- 背景滚动
  360. self:UpdateRoleModel() -- 玩家模型
  361. self:UpdateMonModel() -- 怪物模型
  362. self:CreateBulletItems() -- 子弹节点
  363. -- 后面要改为推算阶段(已改)
  364. self.anim_stage, self.temp_stage_data = self.model:GetRandomAnimStatusAndData()
  365. self:ViewAnimSwitcher()
  366. end
  367. -- 根据当前副本进度更新数据
  368. function ExpHangupMainView:UpdateDunWaveData( )
  369. -- 更新基本奖励
  370. self.cur_wave = self.model:GetCurrentWave()
  371. local route_data = self.model:GetWaveRouteData(self.cur_wave ~= 0 and self.cur_wave or 1)
  372. local chapter_data = self.model:GetExpChapterData(route_data.chapter)
  373. -- self.dun_name_tmp.text = string.format("当前关卡:%s第%s波",
  374. -- Trim(Config.Expdunchapter[route_data.chapter].chapter_name),
  375. -- (self.cur_wave ~= 0 and self.cur_wave or 1) - chapter_data.min_wave + 1)
  376. local ratio = self.model:GetExpHangUpRatio()
  377. local has_ratio_str = ratio == 10000 and "" or string.format("(%s)", (ratio / 100) .. "%")
  378. print("huangcong:ExpHangupMainView [start:399] :", has_ratio_str)
  379. self.eff_val_tmp.text = string.format("当前经验收益:<color=#fdffc2>%s/分%s</color>%s",
  380. WordManager:ConvertNum(self.model:GetExpEfficiency(self.cur_wave, true)),
  381. has_ratio_str,self.add_buff_exp_str)
  382. -- 里程碑相关
  383. self.next_wave = self.cur_wave < TableSize(Config.Expdunwave) and self.cur_wave + 1 or self.cur_wave
  384. local next_wave_route = self.model:GetWaveRouteData(self.next_wave)
  385. -- 首次加载需要限定一次章节数和里程碑数
  386. self.cur_route = next_wave_route.id
  387. self.cur_ms_cfg = self.model:GetNextMainPointByWave(self.next_wave, false) -- 当前进度的下一个里程碑点
  388. end
  389. -- 检查当前是应该扫荡还是挑战副本
  390. function ExpHangupMainView:UpdateSweepOrChallengeStatus( )
  391. -- 先判断玩家是否处于红点等级限制的情况,是则需要实时计算扫荡状态,否则就拿红点缓存就行了
  392. local limit_red = self.model:GetExpDunLimitNewlyRed()
  393. local sweep_red = false
  394. if limit_red then
  395. local dun_data = self.dun_model:GetDunProtoInfo(BaseDungeonModel.DUN_TYPE.EXP)
  396. if dun_data and dun_data[1] then
  397. for k, v in pairs(dun_data[1].rec_data) do
  398. if v.key == 13 then
  399. sweep_red = v.val == 0
  400. break
  401. end
  402. end
  403. end
  404. else
  405. sweep_red = self.model:GetExpRedByRedType(ExpDunModel.Red_Type.Sweep)
  406. end
  407. self.challenge_btn_obj:SetActive(not sweep_red)
  408. self.sweep_btn_obj:SetActive(sweep_red)
  409. -- 红点直接在显示扫荡的时候显示
  410. self.sweep_btn_red_obj:SetActive(sweep_red)
  411. end
  412. -- 当前玩家等级或者战力发生变化时调用,刷新界面等级或战力引导,并判断是否可以挑战副本
  413. function ExpHangupMainView:UpdateExpDunEnterLvAndPowerCondition( )
  414. local power = self.main_role.fighting
  415. local level = self.main_role.level
  416. local wave_cfg = Config.Expdunwave[self.next_wave]
  417. local match_power = power >= wave_cfg.power_limit
  418. local match_level = level >= wave_cfg.lv_limit
  419. -- 等级不够时 显示等级不够的表现 其他情况显示为战力
  420. if match_level then
  421. self.rec_power_tmp.text = string.format("战力要求: <color=%s>%s</color><color=#ffffff>/%s</color>",
  422. match_power and ColorUtil.GREEN_DARK or ColorUtil.RED_DARK, power, wave_cfg.power_limit)
  423. else
  424. self.rec_power_tmp.text = string.format("等级要求: <color=%s>%s</color><color=#ffffff>/%s</color>",
  425. ColorUtil.RED_DARK, level, wave_cfg.lv_limit)
  426. end
  427. self.expdun_can_enter_flag = match_power and match_level
  428. lua_resM:setImageSprite(self, self.rec_power_icon_img, "expDun_asset", self.expdun_can_enter_flag and "exp_route_img11" or "exp_route_img6", true)
  429. SetAnchoredPositionX(self.rec_power_icon, self.expdun_can_enter_flag and 18 or 9.5)
  430. local total_len = 36 + self.rec_power_tmp.preferredWidth + 30
  431. SetSizeDeltaX(self.rec_power_bg, total_len)
  432. -- 设置按钮和文本灰化
  433. SetImageGray(self.challenge_btn_img, not self.expdun_can_enter_flag)
  434. SetTMPSharedMaterial(self.challenge_lb_tmp, self.expdun_can_enter_flag
  435. and ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkOrangeBtn
  436. or ShaderTools.TMPSharedMaterialType.FZZZOutlineDarkGrayBtn)
  437. end
  438. -- 更新放置挂机奖励展示表现和红点
  439. function ExpHangupMainView:UpdateHangupRewardIconStage( )
  440. self:ClearExpDunRewardIconTimer()
  441. local condition = Config.Modulesub["610@16"].open_lv
  442. local lv = self.main_role.level
  443. if condition > lv then -- 未达到开放等级
  444. SetImageGray(self.reward_icon_btn_img, true)
  445. self.reward_icon_lb_tmp.text = string.format("%s级开放", condition)
  446. self.reward_icon_btn_red_obj:SetActive(false)
  447. self.hang_receive_tip_obj:SetActive(false)
  448. else
  449. SetImageGray(self.reward_icon_btn_img, false)
  450. -- 获取挂机时长配置
  451. local max_sec = self.model:GetHangupResourceLimitTime() * 3600
  452. -- 已累计挂机时间
  453. local contain_time
  454. -- local last_time = self.model:GetHangUpReceiveTime()
  455. local offline_red = self.model:GetExpRedByRedType(ExpDunModel.Red_Type.Offline)
  456. local function exp_dun_reward_icon_timer()
  457. contain_time = self.model:GetHangUpContainTimeData()
  458. -- 设置资源储存时间
  459. self.reward_icon_lb_tmp.text = string.format("累计 <color=#2cf86f>%s</color>", TimeUtil:timeConvert(contain_time > max_sec and max_sec or contain_time, "hh:mm:ss"))
  460. if (contain_time >= 3600 or offline_red) and not self.reward_icon_btn_red_obj.activeSelf then -- 超过1小时或者有离线卡显示红点
  461. self.reward_icon_btn_red_obj:SetActive(true)
  462. elseif (contain_time < 3600 and not offline_red) and self.reward_icon_btn_red_obj.activeSelf then
  463. self.reward_icon_btn_red_obj:SetActive(false)
  464. end
  465. if contain_time >= 3600 and not self.hang_receive_tip_obj.activeSelf then -- 超过1小时显示奖励领取tips
  466. self.hang_receive_tip_obj:SetActive(true)
  467. elseif contain_time < 3600 and self.hang_receive_tip_obj.activeSelf then
  468. self.hang_receive_tip_obj:SetActive(false)
  469. end
  470. end
  471. self.exp_dun_reward_icon_timer_id = GlobalTimerQuest:AddPeriodQuest(exp_dun_reward_icon_timer, 1, -1)
  472. exp_dun_reward_icon_timer()
  473. end
  474. end
  475. function ExpHangupMainView:ClearExpDunRewardIconTimer( )
  476. if self.exp_dun_reward_icon_timer_id then
  477. GlobalTimerQuest:CancelQuest(self.exp_dun_reward_icon_timer_id)
  478. self.exp_dun_reward_icon_timer_id = nil
  479. end
  480. end
  481. -- 更新快速挂机累计表现
  482. function ExpHangupMainView:UpdateQuickHangupTimer( )
  483. self:ClearQuickHangupTimer()
  484. local condition = Config.Modulesub["610@15"].open_lv
  485. local lv = self.main_role.level
  486. local have_time = 0
  487. local buff_kind = OperateActivityModel.MaterialSubmitBuffKind.ADVENTURE_EXP --是否存在活动加成buff 免费收取一次二倍
  488. local buff_cfg,buff_info = OperateActivityModel:getInstance():GetMaterialBuffInfoByKind(buff_kind)
  489. -- buff_cfg = {discount = 80,data = 1}
  490. -- buff_info = {etime = TimeUtil:getServerTime( )+300,used = {{kdata = 1,vdata=0}}}
  491. if buff_cfg and buff_info then
  492. have_time = 1
  493. local sec = buff_info.etime - TimeUtil:getServerTime( )
  494. if sec > 0 then
  495. self:ActBuffTimeLate(sec)
  496. for k,v in pairs(buff_info.used) do
  497. if v.kdata == 1 and v.vdata == 1 then--buff有一次免费二倍
  498. have_time = 0
  499. break
  500. end
  501. end
  502. end
  503. end
  504. if condition > lv then -- 未达到开放等级,默认0进度
  505. self.buy_btn_imgex.gray = true
  506. self.buy_timer_tmp.text = string.format("%s级开放", condition)
  507. self.buy_btn_red_obj:SetActive(false)
  508. else
  509. local last_time = self.model:GetQuickHangUpReceiveTime()
  510. local max_time, use_time = self.model:GetHangUpTimeCount()
  511. local left_time -- 距离下次刷新的时间
  512. if last_time ~= 0 and use_time < max_time then
  513. -- 加载当前等级的配置
  514. local hangup_exp_cfg = self.model:GetBuyExpBasicExpCfg()
  515. if not hangup_exp_cfg then
  516. self:ClearQuickHangupTimer()
  517. return
  518. end
  519. local end_time = last_time + hangup_exp_cfg.time -- 下次刷新的时间戳
  520. local function quick_hangup_timer()
  521. left_time = end_time - TimeUtil:getServerTime()
  522. if left_time < 0 or (have_time >= 1 and self.model:GetExpRedByRedType(ExpDunModel.Red_Type.QuickHangUp)) then
  523. self.buy_btn_imgex.gray = false
  524. self.buy_timer_tmp.text = ""
  525. self.buy_btn_red_obj:SetActive(true)
  526. self:ClearQuickHangupTimer()
  527. else
  528. if not self.buy_btn_imgex.gray then
  529. self.buy_btn_imgex.gray = true
  530. end
  531. if self.buy_btn_red_obj.activeSelf then
  532. self.buy_btn_red_obj:SetActive(false)
  533. end
  534. self.buy_timer_tmp.text = string.format("冷却 <color=%s>%s</color>", ColorUtil.RED_DARK, TimeUtil:timeConvert2(left_time))
  535. end
  536. end
  537. self.quick_hangup_timer_id = GlobalTimerQuest:AddPeriodQuest(quick_hangup_timer, 0.5, -1)
  538. quick_hangup_timer()
  539. else
  540. self.buy_btn_imgex.gray = false
  541. self.buy_timer_tmp.text = ""
  542. self.buy_btn_red_obj:SetActive(false)
  543. end
  544. end
  545. end
  546. function ExpHangupMainView:ClearQuickHangupTimer( )
  547. if self.quick_hangup_timer_id then
  548. GlobalTimerQuest:CancelQuest(self.quick_hangup_timer_id)
  549. self.quick_hangup_timer_id = nil
  550. end
  551. end
  552. function ExpHangupMainView:ShowMsReward(ms_data, pos, index)
  553. if not ms_data or not ms_data.reward then return end
  554. if self.temp_ms_data and self.temp_ms_data.wave == ms_data.wave then
  555. self.award_con_obj:SetActive(false)
  556. self.temp_ms_data = nil
  557. return
  558. end
  559. self.temp_ms_data = ms_data
  560. -- 加载里程碑奖励
  561. self.ms_reward_creator = self.ms_reward_creator or self:AddUIComponent(UI.ItemListCreator)
  562. local info = {
  563. data_list = self.temp_ms_data.reward,
  564. item_con = self.award_con,
  565. scroll_view = self.award_con,
  566. obj_pool_type = UIObjPool.UIType.AwardItem,
  567. item_width = 62,
  568. start_x = 6,
  569. start_y = 35,
  570. space_x = 8,
  571. create_frequency = 0.01,
  572. alignment = UnityEngine.TextAnchor.UpperCenter,
  573. on_update_item = function(item, i, v)
  574. local type_Id, lock = GoodsModel:getInstance():GetMappingTypeId(v[1], v[2])
  575. item:SetData(type_Id, v[3], nil, nil, lock)
  576. item:SetItemSize(62, 62)
  577. end,
  578. }
  579. self.ms_reward_creator:UpdateItems(info)
  580. local total_len = 70 * #self.temp_ms_data.reward + 25
  581. SetSizeDeltaX(self.award_con, total_len < 230 and 230 or total_len)
  582. self.award_con_obj:SetActive(true)
  583. -- local cur_scroll_pos_x = self.route_scroll.anchoredPosition.x
  584. local cur_node_pos_x = self.route_con.anchoredPosition.x
  585. local pos_x = pos.x + cur_node_pos_x + self.award_con.sizeDelta.x * 0.25 + 10
  586. local pos_y = index % 2 == 1 and -141.5 or -81.5
  587. SetAnchoredPosition(self.award_con, pos_x, pos_y)
  588. end
  589. -- 2021年3月11日新增
  590. -- 整合副本进度相关表现
  591. -- 加载路线节点 delay_show:界面的表现太多了,这个字段用来控制在打开界面的时候延迟加载
  592. function ExpHangupMainView:UpdateMilestoneItems(delay_show)
  593. -- local data = self.model:GetExpRouteData()
  594. local data = self.model:GetMainRouteData()
  595. local data_num = #data
  596. local role_lv = self.main_role.level
  597. self.total_pages = math.ceil(data_num / 4) -- 这边的数据是将5个波次合并成1条数据,实际上将会是20波一页
  598. self.route_item_creator = self.route_item_creator or self:AddUIComponent(UI.ItemListCreator)
  599. -- 计算当前的目标波数所在的页码,并计算出能查看的页码上限
  600. self.limit_page = self.total_pages + 1
  601. local checked_cur_page = false
  602. local checked_limit_page = false
  603. local temp_route_data, temp_chapter_data
  604. local page_min_wave, page_max_wave
  605. for k = 1, self.total_pages do
  606. local temp_index = k * 4 > data_num and data_num or k * 4
  607. page_max_wave = data[temp_index].ms_data.wave
  608. if self.next_wave <= page_max_wave and not checked_cur_page then
  609. self.cur_page = k
  610. checked_cur_page = true
  611. -- break
  612. end
  613. if not checked_limit_page then
  614. local temp_min_page = k * 4 - 3
  615. page_min_wave = data[temp_min_page].ms_data.wave
  616. temp_route_data = self.model:GetWaveRouteData(page_min_wave)
  617. temp_chapter_data = Config.Expdunchapter[temp_route_data.chapter]
  618. if temp_chapter_data and temp_chapter_data.min_lv > role_lv then
  619. self.limit_page = k
  620. self.page_limit_lv = temp_chapter_data.min_lv
  621. checked_limit_page = true
  622. else
  623. -- 如果不是未解锁的章节,则需要再次置空
  624. page_min_wave = nil
  625. end
  626. end
  627. end
  628. -- 更新当前等级的限制文本内容
  629. self:UpdateRouteLimitLb()
  630. self.expdun_route_update_func = function(cur_page)
  631. local data_index_min = (cur_page - 1) * 4 + 1
  632. local data_index_max = cur_page * 4
  633. data_index_max = data_index_max > data_num and data_num or data_index_max
  634. local item_index = 0 -- 一次最多加载4个节点,这边用来做索引
  635. for i = data_index_min, data_index_max do
  636. item_index = item_index + 1
  637. self.route_item[item_index] = self.route_item[item_index] or ExpDunRouteItem.New(self.route_con)
  638. self.route_item[item_index]:SetData(data[i], self.cur_wave, i, page_min_wave)
  639. self.route_item[item_index]:SetAnchoredPosition((item_index - 1) * 251, 0)
  640. self.route_item[item_index]:SetVisible(true)
  641. end
  642. -- 隐藏多余的节点
  643. for i = item_index + 1, 4 do
  644. if self.route_item[i] then
  645. self.route_item[i]:SetVisible(false)
  646. end
  647. end
  648. end
  649. -- local info = {
  650. -- data_list = data,
  651. -- item_con = self.route_con,
  652. -- scroll_view = self.route_scroll,
  653. -- item_class = ExpDunRouteItem,
  654. -- item_width = 246,
  655. -- start_x = 5,
  656. -- -- space_x = 5,
  657. -- create_frequency = 0.01,
  658. -- reuse_item_num = 7,
  659. -- alignment = UnityEngine.TextAnchor.UpperLeft,
  660. -- on_update_item = function(item, i, v)
  661. -- item:SetData(v, self.cur_wave, i, page_min_wave)
  662. -- end,
  663. -- final_callback = function()
  664. -- self.route_scroll_scroll.horizontal = false
  665. -- -- SetSizeDeltaX(self.route_con, self.route_con.sizeDelta.x + 20, self.route_con.sizeDelta.y)
  666. -- self:ScrollToTargetPage()
  667. -- end,
  668. -- }
  669. if delay_show then
  670. local function delay_method( )
  671. self.expdun_route_update_func(self.cur_page_index)
  672. self:ScrollToTargetPage()
  673. -- self.route_item_creator:UpdateItems(info)
  674. end
  675. if not self.route_item_creator_delayId then
  676. self.route_item_creator_delayId = setTimeout(delay_method, 0.1)
  677. end
  678. else
  679. self.expdun_route_update_func(self.cur_page_index)
  680. self:ScrollToTargetPage()
  681. -- self.route_item_creator:UpdateItems(info)
  682. end
  683. end
  684. function ExpHangupMainView:ScrollToTargetPage(page)
  685. if self.is_in_action then return end
  686. page = page or (self.cur_page > self.limit_page and self.limit_page or self.cur_page) -- 初始加载不可以超过限制页数
  687. if not (self.cur_page_index == page) or self.first_load_route then -- 页码不同才需要坐动画
  688. -- local x_offset = (self.cur_page_index - page) * 984
  689. self.is_in_action = true
  690. if self.route_cg_alpha_id then
  691. TweenLite.Stop(self.route_cg_alpha_id)
  692. self.route_cg_alpha_id = nil
  693. end
  694. self.route_con_cg.alpha = 0
  695. -- local action_con = cc.SweepAction.New(0.1, self.route_con, "right", x_offset, true, true)
  696. local action_con = cc.CallFunc.New(function ()
  697. self.is_in_action = false
  698. self.route_cg_alpha_id = TweenLite.to(self, self.route_con_cg, TweenLite.UiAnimationType.ALPHA_ALL, 1, 0.2)
  699. end)
  700. -- 添加动画
  701. cc.ActionManager:getInstance():addAction(action_con, self.route_con)
  702. self.first_load_route = false
  703. end
  704. self.cur_page_index = page
  705. -- 刷新节点
  706. if self.expdun_route_update_func then
  707. self.expdun_route_update_func(self.cur_page_index)
  708. end
  709. self.arrow_right_obj:SetActive(self.cur_page_index < self.total_pages)
  710. self.arrow_left_obj:SetActive(self.cur_page_index > 1)
  711. -- 如果处于限制页码时,右侧箭头需要灰化
  712. local show_right_arrow_gray = self.limit_page <= self.total_pages and self.cur_page_index == self.limit_page
  713. SetImageGray(self.arrow_right_img, show_right_arrow_gray)
  714. self.route_limit_bg_obj:SetActive(show_right_arrow_gray)
  715. self:UpdateArrowRed()
  716. end
  717. function ExpHangupMainView:UpdateRouteLimitLb( )
  718. self.route_limit_lb_tmp.text = string.format("解锁等级:<color=%s>%s</color>/%s", ColorUtil.RED_DARK,
  719. self.main_role.level, self.page_limit_lv)
  720. end
  721. function ExpHangupMainView:UpdateArrowRed( )
  722. if self.cur_page_index > 1 then -- 更新左侧按钮红点
  723. local bool = false
  724. for i = 1, self.cur_page_index - 1 do
  725. bool = bool or self.model:GetMainRouteMilestoneRedByPages(i)
  726. end
  727. self.arrow_left_red_img.enabled = bool
  728. end
  729. if self.cur_page_index < self.total_pages then -- 更新右侧按钮红点
  730. local bool = false
  731. for i = self.cur_page_index + 1, self.total_pages do
  732. bool = bool or self.model:GetMainRouteMilestoneRedByPages(i)
  733. end
  734. self.arrow_right_red_img.enabled = bool
  735. end
  736. end
  737. -- 动画相关 --
  738. -- 动画相关 --
  739. -- 动画相关 --
  740. -- 主界面动画总控制
  741. function ExpHangupMainView:ViewAnimSwitcher( )
  742. local now_time = Status.NowTime
  743. local function anim_mgr_func()
  744. if self.anim_stage == 1 then -- 飞行阶段
  745. -- 创建怪物数据
  746. self:UpdateMonStageData()
  747. -- 阶段倒计时
  748. local function stage1_timer()
  749. local stage_time = Status.NowTime - now_time
  750. if stage_time >= ExpDunAnimConst.Stage1_Time * 0.8 then -- 飞行时间过后切换到2阶段
  751. self:ClearAnimMgrFuncId()
  752. self.anim_stage = 2
  753. self:ViewAnimSwitcher()
  754. end
  755. end
  756. self:ClearAnimMgrFuncId()
  757. self.anim_mgr_func_id = GlobalTimerQuest:AddPeriodQuest(stage1_timer, 0.05, -1)
  758. elseif self.anim_stage == 2 then -- 发射弹幕阶段
  759. self.has_play_effect_time = 0
  760. self:StartShootBullet()
  761. self:UpdateMonStageData()
  762. self.temp_stage_data = nil
  763. elseif self.anim_stage == 3 then -- 留时间播放奖励表现
  764. local function stage1_timer()
  765. self:ClearAnimMgrFuncId()
  766. self.anim_stage = 1
  767. self:ViewAnimSwitcher()
  768. end
  769. self:UpdateMonStageData()
  770. self:ClearAnimMgrFuncId()
  771. self.anim_mgr_func_id = GlobalTimerQuest:AddPeriodQuest(stage1_timer, ExpDunAnimConst.Run_Stage_Time, -1)
  772. end
  773. end
  774. anim_mgr_func()
  775. end
  776. function ExpHangupMainView:ClearAnimMgrFuncId( )
  777. if self.anim_mgr_func_id then
  778. GlobalTimerQuest:CancelQuest(self.anim_mgr_func_id)
  779. self.anim_mgr_func_id = nil
  780. end
  781. end
  782. -- 加载主角模型
  783. function ExpHangupMainView:UpdateRoleModel( )
  784. -- 加载章节载具
  785. local chapter = self.model:GetExpDunWaveChapter(self.model:GetCurrentWave())
  786. local chapter_cfg = Config.Expdunchapter[chapter]
  787. local extra_offset = ExpDunAnimConst.ExtraOffset[chapter_cfg.res_id]
  788. self.role_mod_pos_offset = extra_offset and extra_offset.model_pos or Vector2(0, 0)
  789. self.launch_pos_offset = extra_offset and extra_offset.launch_pos or Vector2(0, 0)
  790. -- 加载模型
  791. local res_data = {
  792. layer_name = "UI",
  793. type = SceneBaseType.Include_Horse,
  794. father_node = self,
  795. transform = self.role_con,
  796. fashion_type = FuncOpenModel.TypeId.Clothes,
  797. size = Vector2(1200*1.067, 720*1.067),
  798. raycast_size = Vector2(200, 277),
  799. action_name_list = {"run"},
  800. light_id = self.main_role.light_id,
  801. talisman_id = GetTalismanClotheId(self.main_role),
  802. -- scale = 0.43,
  803. -- position = Vector3(0,213,-100),
  804. -- ui_model_type = UIModelCommon.ModelType.RT,
  805. scale = 1,
  806. can_rotate = false,
  807. rotate = 180,
  808. position = Vector3(55, -10, -500),
  809. show_shadow = false,
  810. free_param = chapter_cfg.res_id,
  811. callBack = function()
  812. -- 加载完移回来
  813. SetAnchoredPositionX(self.role_con, -270)
  814. -- 首次加载不需要动画,直接定在某个点
  815. self:StartRoleModelAutoAnim(true)
  816. end,
  817. }
  818. FuncOpenModel:getInstance():SetModelRes(res_data)
  819. -- 重新加载背景图
  820. local function bg_roll_callback()
  821. self.bg_roll_raw.uvRect = self.bg_roll_uvRect
  822. end
  823. lua_resM:setOutsideRawImage(self, self.bg_roll_raw, GameResPath.GetViewBigBg("exp_anim_bg" .. chapter_cfg.bg_id), false, bg_roll_callback)
  824. -- 加载背景图远景图
  825. local function bg_roll_back_callback()
  826. self.bg_roll_back_raw.uvRect = self.bg_roll_back_uvRect
  827. end
  828. lua_resM:setOutsideRawImage(self, self.bg_roll_back_raw, GameResPath.GetViewBigBg("exp_anim_bg_back_" .. chapter_cfg.bg_id), false, bg_roll_back_callback)
  829. end
  830. -- 开始主角模型漂移动画
  831. function ExpHangupMainView:StartRoleModelAutoAnim(no_anim)
  832. if not self.role_ram_pos_index then
  833. self.role_ram_pos_index = math_random(1, #self.role_ran_pos)
  834. else
  835. local new_pos = self.role_ram_pos_index
  836. -- 保证获取一个跟上个坐标不相等的位移点
  837. while(new_pos == self.role_ram_pos_index) do
  838. new_pos = math_random(1, #self.role_ran_pos)
  839. end
  840. self.role_ram_pos_index = new_pos
  841. end
  842. local pos_cfg = self.role_ran_pos[self.role_ram_pos_index]
  843. local auto_pos = Vector3(self.role_pos_origin.x + pos_cfg.pos.x + self.role_mod_pos_offset.x, self.role_pos_origin.y + pos_cfg.pos.y + self.role_mod_pos_offset.y, 0)
  844. local amin_scale = Vector3(pos_cfg.scale, pos_cfg.scale, pos_cfg.scale)
  845. local call_back = function()
  846. self:StartRoleModelAutoAnim(false)
  847. end
  848. self:ClearRoleModelAutoAnimId()
  849. self.role_model_move_anim_id = TweenLite.to(self, self.role_con, TweenLite.UiAnimationType.POS, auto_pos, pos_cfg.anim_time, call_back)
  850. self.role_model_scale_anim_id = TweenLite.to(self, self.role_con, TweenLite.UiAnimationType.SCALE, amin_scale, pos_cfg.anim_time)
  851. end
  852. function ExpHangupMainView:ClearRoleModelAutoAnimId( )
  853. if self.role_model_move_anim_id then
  854. TweenLite.Stop(self.role_model_move_anim_id)
  855. self.role_model_move_anim_id = nil
  856. end
  857. if self.role_model_scale_anim_id then
  858. TweenLite.Stop(self.role_model_scale_anim_id)
  859. self.role_model_scale_anim_id = nil
  860. end
  861. end
  862. function ExpHangupMainView:UpdateMonModel()
  863. -- 播放怪物死亡后的奖励动画
  864. local function reward_anim_callback(index)
  865. local mon_item_pos = self.mon_model_list[index]:GetAnchoredPosition()
  866. SetAnchoredPosition(self["anim_reward_con"..index], mon_item_pos.x - 29.5 + 1, mon_item_pos.y + 93 + 59)
  867. self["award_item" .. index]:SetVisible(true)
  868. local function anim_end_fun()
  869. if self["award_item" .. index] then
  870. self["award_item" .. index]:SetVisible(false)
  871. self:OnRewardAnimEndShake() -- 收入宝箱之后播放宝箱动画
  872. end
  873. end
  874. self:ClearRewardAnim(index)
  875. self["reward_anim_id" .. index] = TweenLite.to(self, self["anim_reward_con"..index],
  876. TweenLite.UiAnimationType.ANCHORED_POS, self.reward_icon_btn.anchoredPosition, 1,
  877. anim_end_fun, TweenFunc.EASE_IN_QUINT)
  878. end
  879. if self.mon_model_list == nil then
  880. self.mon_model_list = {}
  881. for i = 1, 3 do
  882. self.mon_model_list[i] = ExpHangupMonModelItem.New(self.mon_con, nil, self.layer_name)
  883. self.mon_model_list[i]:SetRewardAnimCallback(i, reward_anim_callback)
  884. self.mon_model_list[i]:SetHpParentNode(self.hp_con)
  885. end
  886. end
  887. self:StartMonModelIndexFunc()
  888. end
  889. -- 收入宝箱之后播放宝箱动画
  890. function ExpHangupMainView:OnRewardAnimEndShake( )
  891. -- 先清除动画
  892. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.reward_icon_btn)
  893. SetLocalScale(self.reward_icon_btn, 1, 1, 1)
  894. local anim_scale = 1 * 0.9
  895. local action1 = cc.ScaleTo.New( 0.1, anim_scale, anim_scale, anim_scale)
  896. local action2 = cc.ScaleTo.New( 0.1, 1, 1, 1)
  897. local action8 = cc.Sequence.New(action1, action2)--顺序
  898. cc.ActionManager:getInstance():addAction(action8, self.reward_icon_btn)
  899. end
  900. function ExpHangupMainView:ClearRewardAnim(index)
  901. if self["reward_anim_id" .. index] then
  902. TweenLite.Stop(self["reward_anim_id" .. index])
  903. self["reward_anim_id" .. index] = nil
  904. end
  905. end
  906. function ExpHangupMainView:StartMonModelIndexFunc( )
  907. self:ClearMonModelIndexFunc()
  908. self.mon_index_1 = self.mon_model_list[1].transform:GetSiblingIndex()
  909. self.mon_index_2 = self.mon_model_list[2].transform:GetSiblingIndex()
  910. self.mon_index_3 = self.mon_model_list[3].transform:GetSiblingIndex()
  911. local temp_tb = {}
  912. local function mon_model_index_func()
  913. for k, v in ipairs(self.mon_model_list) do
  914. temp_tb[k] = temp_tb[k] or {}
  915. temp_tb[k].index = k - 1
  916. temp_tb[k].scale = v:GetMonConScale()
  917. end
  918. local sort_func = function ( a, b )
  919. return a.scale < b.scale
  920. end
  921. table.sort(temp_tb, sort_func)
  922. if self.mon_index_1 ~= temp_tb[1].index
  923. or self.mon_index_2 ~= temp_tb[2].index
  924. or self.mon_index_3 ~= temp_tb[3].index then -- 缩放顺序发生变动
  925. self.mon_model_list[1].transform:SetSiblingIndex(temp_tb[1].index)
  926. self.mon_index_1 = temp_tb[1].index
  927. self.mon_model_list[2].transform:SetSiblingIndex(temp_tb[2].index)
  928. self.mon_index_2 = temp_tb[2].index
  929. self.mon_model_list[3].transform:SetSiblingIndex(temp_tb[3].index)
  930. self.mon_index_3 = temp_tb[3].index
  931. end
  932. end
  933. self.mon_model_index_func_id = GlobalTimerQuest:AddPeriodQuest(mon_model_index_func, 0.1, -1)
  934. end
  935. function ExpHangupMainView:ClearMonModelIndexFunc( )
  936. if self.mon_model_index_func_id then
  937. GlobalTimerQuest:CancelQuest(self.mon_model_index_func_id)
  938. self.mon_model_index_func_id = nil
  939. end
  940. end
  941. -- 更新阶段怪物数据
  942. function ExpHangupMainView:UpdateMonStageData( )
  943. local chapter = self.model:GetExpDunWaveChapter(self.model:GetCurrentWave())
  944. local chapter_cfg = Config.Expdunchapter[chapter]
  945. local mon_id = chapter_cfg and chapter_cfg.mon_id
  946. -- -- 生成一个随机boss
  947. -- local mon_id = self.anim_stage ~= 1 and self.last_anim_mon_id or self.mon_id_list[math_random(1, #self.mon_id_list)]
  948. for k, v in ipairs(self.mon_model_list) do
  949. if self.anim_stage == 1 or not self.mon_stage_data[k] then -- 初次创建或者1阶段时需要重新刷新
  950. self.mon_stage_data[k] = {
  951. pos = Vector2((k % 2) * -70, -80 + (k-1) * 80 - 20),
  952. mod_pos = Vector2((k % 2 == 0) and 130 or 250, math_random(-50, 50)),
  953. }
  954. end
  955. if self.anim_stage == 2 and self.temp_stage_data then
  956. self.mon_stage_data[k] = self.mon_stage_data[k] or {}
  957. self.mon_stage_data[k].cur_hp = self.temp_stage_data.hp_data[k]
  958. end
  959. v:SetData(self.anim_stage, mon_id, self.mon_stage_data[k])
  960. end
  961. end
  962. -- 创建一定量的子弹节点
  963. function ExpHangupMainView:CreateBulletItems( )
  964. if not self.bullet_list then
  965. self.bullet_list = {}
  966. for i = 1, ExpDunAnimConst.BulletNum do
  967. self.bullet_list[i] = ExpHangupBulletItem.New(self.bullet_con, nil, self.layer_name, 1)
  968. end
  969. end
  970. if not self.bullet_slay_list then
  971. self.bullet_slay_list = {}
  972. for i = 1, ExpDunAnimConst.BulletNumSlay do
  973. self.bullet_slay_list[i] = ExpHangupBulletItem.New(self.bullet_slay_con, nil, self.layer_name, 2)
  974. end
  975. end
  976. end
  977. -- 使用已创建的子弹特效节点做到击中怪物的效果
  978. function ExpHangupMainView:StartShootBullet( )
  979. local bullet_time = ExpDunAnimConst.BulletTime -- 子弹动画时间
  980. local atk_duration = ExpDunAnimConst.Role_Attack_Duration -- 攻击间隔
  981. -- 动画开始的时间
  982. local start_anim_time = Status.NowTime - (self.temp_stage_data and self.temp_stage_data.status_pass_time or 0)
  983. -- 上次发射时间
  984. local last_launch_time = Status.NowTime - bullet_time
  985. local slay_wait_time = ExpDunAnimConst.SlayBulletEffectWaitTime
  986. local slay_anim_time = ExpDunAnimConst.SlayBulletEffectAnimTime
  987. local bullet_data = {}
  988. local function auto_shoot_func()
  989. local pass_time = Status.NowTime - last_launch_time
  990. local anim_total_time = Status.NowTime - start_anim_time -- 动画经过了的时间
  991. if pass_time >= atk_duration then
  992. -- 选出一个不在动画状态中的子弹
  993. local item
  994. for k, v in ipairs(self.bullet_list) do
  995. if not v:GetIsAnimating() then
  996. item = v
  997. break
  998. end
  999. end
  1000. -- 随机出一个没死的怪物
  1001. local un_dead_list = {}
  1002. for k, v in ipairs(self.mon_model_list) do
  1003. if not v:GetIsDead() then
  1004. un_dead_list[#un_dead_list+1] = v
  1005. end
  1006. end
  1007. if #un_dead_list == 0 then -- 怪物死完,播放第三阶段
  1008. self:ClearAnimMgrFuncId()
  1009. self.anim_stage = 3
  1010. self:ViewAnimSwitcher()
  1011. -- self:PlayShootingSound(false)
  1012. else
  1013. if item then
  1014. local function hit_callback()
  1015. for k, target in ipairs(un_dead_list) do
  1016. if target then
  1017. if not target:GetIsDead() then
  1018. target:UpdateGetHit(math_random(2, 5))
  1019. end
  1020. end
  1021. end
  1022. end
  1023. -- 控制终结动画
  1024. if anim_total_time >= slay_wait_time and Status.NowTime - self.last_slay_effect_time > slay_anim_time then
  1025. self.last_slay_effect_time = Status.NowTime
  1026. self:StartSlayBulletEffect()
  1027. end
  1028. bullet_data = {
  1029. start_pos = self.role_con.anchoredPosition + Vector2(self.launch_pos_offset.x, self.launch_pos_offset.y),
  1030. anim_time = bullet_time,
  1031. callback = hit_callback,
  1032. is_normal_bullet = true,
  1033. }
  1034. item:SetData(bullet_data)
  1035. last_launch_time = Status.NowTime
  1036. -- self:PlayShootingSound(true)
  1037. end
  1038. end
  1039. end
  1040. end
  1041. self:ClearAnimMgrFuncId()
  1042. self.anim_mgr_func_id = GlobalTimerQuest:AddPeriodQuest(auto_shoot_func, 0.03, -1)
  1043. end
  1044. -- 子弹音效
  1045. function ExpHangupMainView:PlayShootingSound( is_play )
  1046. do return end
  1047. if is_play then
  1048. if not self.shooting_sound_id then
  1049. self.shooting_sound_id = lua_soundM:PlayEffect(self, "shooting", true, LuaSoundManager.SOUND_TYPE.UI)
  1050. end
  1051. else
  1052. if self.shooting_sound_id then
  1053. lua_soundM:StopEffect(self, LuaSoundManager.SOUND_TYPE.UI, self.shooting_sound_id)
  1054. self.shooting_sound_id = nil
  1055. end
  1056. end
  1057. end
  1058. -- 开始终结子弹表现
  1059. function ExpHangupMainView:StartSlayBulletEffect( )
  1060. local bullet_data = {}
  1061. local anim_time = ExpDunAnimConst.SlayBulletEffectAnimTime
  1062. self.has_play_effect_time = self.has_play_effect_time + 1
  1063. for k, v in pairs(self.bullet_slay_list) do
  1064. bullet_data = {
  1065. start_pos = self.role_con.anchoredPosition + Vector2(self.launch_pos_offset.x, self.launch_pos_offset.y),
  1066. anim_time = anim_time,
  1067. show_effect_type = self.has_play_effect_time,
  1068. is_normal_bullet = false,
  1069. }
  1070. v:SetData(bullet_data)
  1071. end
  1072. -- 延时销毁所有怪物
  1073. local function delay_slay_all_mon()
  1074. for k, v in ipairs(self.mon_model_list) do
  1075. if not v:GetIsDead() then
  1076. v:UpdateGetHit(ExpDunAnimConst.SlayBulletEffectDmg)
  1077. end
  1078. end
  1079. end
  1080. self:ClearDelaySlayAllMonId()
  1081. self.delay_slay_all_mon_id = GlobalTimerQuest:AddDelayQuest(delay_slay_all_mon, ExpDunAnimConst.SlayBulletEffectDmgWaitTime)
  1082. end
  1083. function ExpHangupMainView:ClearDelaySlayAllMonId( )
  1084. if self.delay_slay_all_mon_id then
  1085. GlobalTimerQuest:CancelQuest(self.delay_slay_all_mon_id)
  1086. self.delay_slay_all_mon_id = nil
  1087. end
  1088. end
  1089. -- 开始背景滚动
  1090. function ExpHangupMainView:StartBgRollAnim( )
  1091. local last_time = Status.NowTime
  1092. local speed = ExpDunAnimConst.BgSpeed
  1093. local function bg_roll_anim()
  1094. local pass_time = Status.NowTime - last_time
  1095. local move_x = pass_time * speed * (self.anim_stage ~= 1 and ExpDunAnimConst.CombatBgSpeed or 1)
  1096. self.bg_roll_uvRect.x = self.bg_roll_uvRect.x + move_x
  1097. self.bg_roll_raw.uvRect = self.bg_roll_uvRect
  1098. self.bg_roll_back_uvRect.x = self.bg_roll_back_uvRect.x + move_x * 0.2
  1099. self.bg_roll_back_raw.uvRect = self.bg_roll_back_uvRect
  1100. last_time = Status.NowTime
  1101. end
  1102. self:ClearBgRollAnimId()
  1103. self.bg_roll_anim_id = GlobalTimerQuest:AddPeriodQuest(bg_roll_anim, 0.02, -1)
  1104. end
  1105. function ExpHangupMainView:ClearBgRollAnimId( )
  1106. if self.bg_roll_anim_id then
  1107. GlobalTimerQuest:CancelQuest(self.bg_roll_anim_id)
  1108. self.bg_roll_anim_id = nil
  1109. end
  1110. end
  1111. function ExpHangupMainView:UpdateEffRed( )
  1112. self.challenge_red_obj:SetActive(self.model:GetNextWaveFitPowerRed() and self.model:GetNextWaveFitLevel())
  1113. end
  1114. function ExpHangupMainView:DestroySuccess( )
  1115. -- self:PlayShootingSound(false)
  1116. self:ClearExpDunRewardIconTimer()
  1117. self:ClearQuickHangupTimer()
  1118. for k,v in pairs(self.route_item) do
  1119. v:DeleteMe()
  1120. v = nil
  1121. end
  1122. self.route_item = {}
  1123. if self.route_item_creator_delayId then
  1124. GlobalTimerQuest:CancelQuest(self.route_item_creator_delayId)
  1125. self.route_item_creator_delayId = nil
  1126. end
  1127. if self.route_cg_alpha_id then
  1128. TweenLite.Stop(self.route_cg_alpha_id)
  1129. self.route_cg_alpha_id = nil
  1130. end
  1131. self:ClearUIEffect(self.challenge_btn)
  1132. OperateActivityModel:getInstance().boss_drop_act = false
  1133. self:ClearUIEffect(self.buy_btn_effect)
  1134. self:ClearAnimMgrFuncId()
  1135. self:ClearMonModelIndexFunc()
  1136. self:ClearDelaySlayAllMonId()
  1137. self:ClearRewardAnim(1)
  1138. self:ClearRewardAnim(2)
  1139. self:ClearRewardAnim(3)
  1140. if self.mon_model_list then
  1141. for k, v in pairs(self.mon_model_list) do
  1142. v:DeleteMe()
  1143. v = nil
  1144. end
  1145. self.mon_model_list = nil
  1146. end
  1147. if self.bullet_list then
  1148. for k, v in pairs(self.bullet_list) do
  1149. v:DeleteMe()
  1150. v = nil
  1151. end
  1152. self.bullet_list = nil
  1153. end
  1154. if self.bullet_slay_list then
  1155. for k, v in pairs(self.bullet_slay_list) do
  1156. v:DeleteMe()
  1157. v = nil
  1158. end
  1159. self.bullet_slay_list = nil
  1160. end
  1161. for i = 1, 3 do
  1162. if self["award_item" .. i] then
  1163. UIObjPool:getInstance():PushItem(UIObjPool.UIType.AwardItem, self["award_item" .. i])
  1164. self["award_item" .. i] = nil
  1165. end
  1166. end
  1167. if self.act_buff_timer_id then
  1168. GlobalTimerQuest:CancelQuest(self.act_buff_timer_id)
  1169. self.act_buff_timer_id = nil
  1170. end
  1171. if self.on_level_up_id then
  1172. self.main_role:UnBind(self.on_level_up_id)
  1173. self.on_level_up_id = nil
  1174. end
  1175. if self.on_role_power_change_id then
  1176. self.main_role:UnBind(self.on_role_power_change_id)
  1177. self.on_role_power_change_id = nil
  1178. end
  1179. self:ClearRoleModelAutoAnimId()
  1180. self:ClearBgRollAnimId()
  1181. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.reward_icon_btn)
  1182. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.route_con)
  1183. -- 缓存背景的uv偏移
  1184. self.model.main_bg_roll_uvRect = self.bg_roll_uvRect
  1185. self.model.main_bg_roll_back_uvRect = self.bg_roll_back_uvRect
  1186. end
  1187. function ExpHangupMainView:AddToStageHandler()
  1188. local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_EXP_DUNGEON,3)
  1189. if not helpVo then return end
  1190. local help_type = helpVo.help_type
  1191. local step = helpVo.step
  1192. local button = false
  1193. if (help_type == HelpType.TYPE_EXP_DUNGEON) and step == 3 then
  1194. button = self.challenge_btn_obj
  1195. end
  1196. if button then
  1197. local function call_back()
  1198. end
  1199. GlobalEventSystem:Fire(EventName.OPEN_GUIDE_PROMPT_VIEW, button.transform, self.transform, call_back, helpVo, self.layout_file)
  1200. end
  1201. end
  1202. function ExpHangupMainView:Close()
  1203. local helpVo = GuideModel:getInstance():GetHelpVo(HelpType.TYPE_EXP_DUNGEON,3)
  1204. if helpVo then
  1205. if helpVo.step == 3 then
  1206. GlobalEventSystem:Fire(EventName.CLOSE_GUIDE_PROMPT_VIEW)
  1207. end
  1208. end
  1209. BaseView.Close(self)
  1210. end
  1211. --活动BUFF时间倒计时
  1212. function ExpHangupMainView:ActBuffTimeLate( sec )
  1213. if self.is_loaded then
  1214. if self.act_sec == sec then
  1215. return
  1216. else
  1217. self.act_sec = sec
  1218. end
  1219. if self.act_buff_timer_id then
  1220. GlobalTimerQuest:CancelQuest(self.act_buff_timer_id)
  1221. self.act_buff_timer_id = nil
  1222. end
  1223. local sec = sec or 0
  1224. if sec > 0 then
  1225. local function onTimer()
  1226. sec = sec - 1
  1227. if sec > 0 then
  1228. else
  1229. if self.act_buff_timer_id then
  1230. GlobalTimerQuest:CancelQuest(self.act_buff_timer_id)
  1231. self.act_buff_timer_id = nil
  1232. end
  1233. self:UpdateQuickHangupTimer()
  1234. end
  1235. end
  1236. if not self.act_buff_timer_id then
  1237. self.act_buff_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer, 1, -1)
  1238. end
  1239. onTimer()
  1240. else
  1241. self:UpdateQuickHangupTimer()
  1242. end
  1243. end
  1244. end