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

644 lines
18 KiB

  1. BaseItem = BaseItem or BaseClass(UIPartical)
  2. local BaseItem = BaseItem
  3. local LuaViewManager = LuaViewManager
  4. local lua_viewM = lua_viewM
  5. local GetChildTransforms = GetChildTransforms
  6. local GetChildGameObjects = GetChildGameObjects
  7. local GetChildImages = GetChildImages
  8. local GetChildTexts = GetChildTexts
  9. local newObject = newObject
  10. BaseItem.Class_Type = "BaseItem"
  11. function BaseItem:__init(parent_wnd,prefab_asset,layer_name)
  12. self.parent_wnd = parent_wnd or false -- 父容器
  13. self.prefab_asset = prefab_asset or false --预制体 如果有传进来就直接通过预制体创建对象 免去加载预制体的过程
  14. self.layer_name = layer_name or false --需要挂接特效的时候 必须设置
  15. end
  16. --属性用途基本和baseview一致
  17. function BaseItem:__defineVar()
  18. return {
  19. _class_type = self,
  20. _iid = _in_obj_ins_id,
  21. _use_delete_method = false,
  22. base_file = nil,
  23. layout_file = nil,
  24. parent_wnd = nil,
  25. is_delay_callback = false,
  26. Load_callback = nil , -- 加载的回调函数,必须由子类重写
  27. is_loaded = nil,
  28. visible = -1, --等待加载完回调的visible状态
  29. use_local_view = false,
  30. position = false,
  31. anchoredPosition = false,
  32. cache_findChild = nil,
  33. prefab_asset = nil,
  34. need_refreshData = nil,
  35. gameObject = nil,
  36. transform = nil,
  37. is_guide_module = false,--是否是新手引导模块
  38. ReOpen_callback = nil, --重新打开界面,刷新事件
  39. is_hide_delete_effect = true, --隐藏时删除特效
  40. hide_clear_role_model = true, --隐藏时删除模型
  41. is_imm_show = true, --立即显示;有问题的界面需要设为false,就会等到加载完再显示
  42. full_screen = false, --全屏模式
  43. ani_right = false, --右侧动画
  44. ani_left = false, --左侧动画
  45. adjust_mid = false, --中间布局调整
  46. ani_list = false,
  47. move_node_list = false, --移动到背景节点列表
  48. cache_move_node_list = false,--缓存移动到背景节点列表
  49. parent_view_target = false, --item所在界面
  50. }
  51. end
  52. function BaseItem:__delete()
  53. self:RemoveUIFromBack()
  54. self:Destroy()
  55. self:AfterDestroy()
  56. end
  57. function BaseItem:Destroy()
  58. if self.gameObject == nil then return end
  59. if self.transform and not IsNull(self.transform) and self.transform.name then
  60. GlobalEventSystem:Fire(EventName.BASE_ITEM_DELETE, self.transform.name,self.layout_file)
  61. end
  62. if self._base_delay_load_id then
  63. LuaViewManager:getInstance():RemoveDelayQueue(self._base_delay_load_id)
  64. self._base_delay_load_id = nil
  65. end
  66. if self.trigger_guide_id then
  67. EventSystem.UnBind(GlobalEventSystem, self.trigger_guide_id)
  68. self.trigger_guide_id = false
  69. end
  70. UI.BindEventComp.UnBindAll(self)
  71. if self.action_nodes then
  72. for k,v in pairs(self.action_nodes) do
  73. cc.ActionManager:getInstance():removeAllActionsFromTarget(v)
  74. end
  75. self.action_nodes = nil
  76. end
  77. if self.effect_nodes then
  78. for k,v in pairs(self.effect_nodes) do
  79. self:ClearUIEffect(v)
  80. end
  81. end
  82. if self.autoDeleteList then
  83. for i,v in ipairs(self.autoDeleteList) do
  84. if v ~= nil then
  85. v:DeleteMe()
  86. end
  87. end
  88. self.autoDeleteList = nil
  89. end
  90. if self.orientation_change_id then
  91. EventSystem.UnBind(GlobalEventSystem,self.orientation_change_id)
  92. self.orientation_change_id = nil
  93. end
  94. LuaViewManager.ClearItem(lua_viewM, self.gameObject)
  95. self.parent_wnd = nil
  96. self.gameObject = nil
  97. self.transform = nil
  98. self.cache_findChild = nil
  99. self.prefab_asset = nil
  100. self.is_loaded = false
  101. self.need_refreshData = false
  102. self.parent_view_target = false
  103. self.cache_move_node_list = false
  104. self:AfterDestroy()
  105. end
  106. --[[
  107. transform
  108. "input/Text"
  109. ]]
  110. function BaseItem:GetChild(name)
  111. if self.cache_findChild and self.transform then
  112. return self.cache_findChild(self.transform,name)
  113. end
  114. end
  115. function BaseItem:GetChildComponent(name,com)
  116. return self:GetChild(name):GetComponent(com)
  117. end
  118. --获取多个孩子transform
  119. function BaseItem:GetChildTransforms(names)
  120. return GetChildTransforms(self.transform, names)
  121. end
  122. --获取多个孩子go
  123. function BaseItem:GetChildGameObjects(names)
  124. return GetChildGameObjects(self.transform, names)
  125. end
  126. --获取多个孩子image
  127. function BaseItem:GetChildImages(names)
  128. return GetChildImages(self.transform, names)
  129. end
  130. --获取多个孩子text
  131. function BaseItem:GetChildTexts(names)
  132. return GetChildTexts(self.transform, names)
  133. end
  134. function BaseItem:Load()
  135. if not self.parent_wnd then
  136. print ("error parent_wnd is Null")
  137. return
  138. end
  139. if self.gameObject then
  140. return
  141. end
  142. if self.prefab_asset and tostring(self.prefab_asset) ~= "null" then
  143. local go = newObject(self.prefab_asset)
  144. go.name = self.layout_file
  145. self:DoCreateItemIndeed(go)
  146. else
  147. local res_load_finish = function(obj)
  148. assert(obj~=nil, "BaseItem:Load failed:cannot find basefile : "..self.base_file.." layout:"..self.layout_file)
  149. self:DoCreateItemIndeed(obj)
  150. end
  151. self.is_loaded = false
  152. LuaViewManager.LoadItem(lua_viewM, self,self.base_file, self.layout_file, res_load_finish)
  153. end
  154. end
  155. function BaseItem:DoCreateItemIndeed(obj)
  156. self.gameObject = obj
  157. if self._use_delete_method then
  158. self:Destroy()
  159. return
  160. end
  161. if self.is_imm_show == false then
  162. self.gameObject:SetActive(false) --先调一次隐藏 避免显示有问题
  163. end
  164. self.transform = obj.transform
  165. self.cache_findChild = self.transform.Find
  166. self.transform:SetParent(self.parent_wnd)
  167. SetLocalScale(self.transform)
  168. SetLocalPosition(self.transform)
  169. self:InitViewAnimation()
  170. local function onLoad()
  171. if not IsNull(self.gameObject) and not self._use_delete_method then
  172. self.gameObject:SetActive(true)
  173. self.is_loaded = true
  174. self:SetRotation(0,0,0)--配合SetVisible优化用的,防止加载慢引起的显示错误
  175. self:BeforeLoad()
  176. if self.Load_callback then
  177. self:Load_callback()
  178. else
  179. LogError(self.layout_file ..":Load_callback must be override!")
  180. end
  181. if self.visible ~= -1 then
  182. self:SetVisible(self.visible, self.cache_force_hide)
  183. end
  184. if self.position then
  185. self:SetPosition(self.position.x,self.position.y)
  186. self.position = false
  187. end
  188. if self.anchoredPosition then
  189. self:SetAnchoredPosition(self.anchoredPosition.x,self.anchoredPosition.y)
  190. self.anchoredPosition = false
  191. end
  192. if self.scale then
  193. self:SetScale(self.scale)
  194. self.scale = false
  195. end
  196. if self.full_screen then
  197. local function onOrientationChange( )
  198. self:SetIpxMode()
  199. end
  200. if not self.orientation_change_id then
  201. self.orientation_change_id = GlobalEventSystem:Bind(EventName.ORIENTATION_DID_CHANGE, onOrientationChange)
  202. end
  203. end
  204. if self.gameObject_name then
  205. self:SetGameObjectName(self.gameObject_name)
  206. end
  207. self:DoOpenAni()
  208. end
  209. end
  210. if self.is_delay_callback then
  211. if self._base_delay_load_id then
  212. LuaViewManager.RemoveDelayQueue(lua_viewM, self._base_delay_load_id)
  213. self._base_delay_load_id = false
  214. end
  215. self._base_delay_load_id = LuaViewManager.AddDelayQueue(lua_viewM, onLoad)
  216. else
  217. onLoad()
  218. end
  219. end
  220. function BaseItem:SetVisible(state, force_hide)
  221. if self.is_loaded then
  222. self:SetBackUIVisible(state)
  223. if force_hide then
  224. --部分确实需要使用SetActive的
  225. if type(state) == "boolean" and force_hide and self.gameObject.activeSelf ~= state then
  226. if state and rawget(self, "cache_change_rotation") then
  227. self:SetRotation(0,0,0)
  228. end
  229. self.gameObject:SetActive(state)
  230. end
  231. else
  232. --旋转角度代替显示隐藏减少批次
  233. -------------------------
  234. if type(state) == "boolean" and state == true then
  235. self:SetRotation(0,0,0)
  236. if self.gameObject.activeSelf ~= true then
  237. self.gameObject:SetActive(true)
  238. end
  239. else
  240. self.cache_change_rotation = true
  241. self:SetRotation(90,90,0)
  242. end
  243. end
  244. if state == false then
  245. --隐藏的时候自动删掉挂接的模型和特效,需要在对应ITEM的ReOpen_callback后再创建
  246. if self.hide_clear_role_model then
  247. lua_resM:clearRoleMode(self)
  248. end
  249. if self.is_hide_delete_effect then
  250. self:ClearAllEffect()
  251. self:ResetUIZDepth()
  252. end
  253. elseif state == true and self.visible == false then
  254. if self.ReOpen_callback then
  255. self:ReOpen_callback()
  256. end
  257. end
  258. self.visible = state
  259. self.cache_force_hide = force_hide
  260. else
  261. self.visible = state
  262. self.cache_force_hide = force_hide
  263. end
  264. end
  265. function BaseItem:GetVisible()
  266. if self.is_loaded then
  267. return self.gameObject.activeSelf
  268. else
  269. return false
  270. end
  271. end
  272. function BaseItem:SetPosition(x, y)
  273. if self.is_loaded then
  274. SetLocalPosition(self.transform, x, y, 0)
  275. else
  276. self.position = Vector3(x,y,0)
  277. end
  278. end
  279. function BaseItem:GetPosition()
  280. if self.is_loaded then
  281. return self.transform.localPosition
  282. else
  283. return self.position or Vector3.zero
  284. end
  285. end
  286. function BaseItem:SetAnchoredPosition(x, y)
  287. if self.is_loaded then
  288. SetAnchoredPosition(self.transform,x,y)
  289. else
  290. self.anchoredPosition = Vector2(x,y)
  291. end
  292. end
  293. function BaseItem:GetAnchoredPosition()
  294. if self.is_loaded then
  295. return self.transform.anchoredPosition
  296. else
  297. return self.anchoredPosition or Vector2.zero
  298. end
  299. end
  300. function BaseItem:SetScale(scale)
  301. if self.is_loaded then
  302. SetLocalScale(self.transform, scale)
  303. else
  304. self.scale = scale
  305. end
  306. end
  307. function BaseItem:SetRotation(x,y,z)
  308. if self.is_loaded then
  309. self.transform.localRotation = Quaternion.Euler(x, y, z)
  310. end
  311. end
  312. function BaseItem:SetGameObjectName(name)
  313. if self.is_loaded then
  314. self.transform.name = name
  315. else
  316. self.gameObject_name = name
  317. end
  318. end
  319. function BaseItem:GetGameObjectName()
  320. if self.is_loaded then
  321. return self.transform.name
  322. else
  323. return self.gameObject_name or ""
  324. end
  325. end
  326. function BaseItem:GetChildren( names )
  327. GetChildren(self, names)
  328. end
  329. function BaseItem:GetSiblingIndex( )
  330. if self.is_loaded then
  331. self.transform:GetSiblingIndex()
  332. end
  333. end
  334. function BaseItem:SetSiblingIndex( value )
  335. if self.is_loaded then
  336. self.sibling_index = value or 0
  337. if self.sibling_index == 0 then
  338. self.transform:SetAsFirstSibling()
  339. else
  340. self.transform:SetSiblingIndex(self.sibling_index)
  341. end
  342. else
  343. self.sibling_index = value
  344. end
  345. end
  346. -- 显示子窗口
  347. function BaseItem:PopUpChild(win)
  348. if win then
  349. if self.popChild ~= nil and self.popChild ~= win then
  350. self.popChild:SetVisible(false, true)
  351. end
  352. self.popChild = win
  353. self.popChild:SetVisible(true, true)
  354. end
  355. end
  356. --移出屏幕(隐藏,用于频繁调用显示隐藏的对象,减少setActive的调用次数)
  357. function BaseItem:MoveOutOfScreen( transform )
  358. transform = transform or self.transform
  359. if transform then
  360. self.base_move_from_pos_y = self.base_move_from_pos_y or GetLocalPositionY(transform)
  361. SetLocalPositionY(transform, -99999)
  362. end
  363. end
  364. --移回屏幕(显示,用于频繁调用显示隐藏的对象,减少setActive的调用次数)
  365. function BaseItem:MoveInToScreen( transform )
  366. transform = transform or self.transform
  367. if transform and self.base_move_from_pos_y then
  368. SetLocalPositionY(transform, self.base_move_from_pos_y)
  369. self.base_move_from_pos_y = false
  370. end
  371. end
  372. --关闭界面时销毁该节点
  373. function BaseItem:AutoDelete( deleteNode )
  374. self.autoDeleteList = self.autoDeleteList or {}
  375. table.insert(self.autoDeleteList, deleteNode)
  376. end
  377. --自销毁事件
  378. function BaseItem:BindEvent( bindDispather, eventName, handleFunc )
  379. return UI.BindEventComp.BindEvent(self, bindDispather, eventName, handleFunc)
  380. end
  381. --自销毁节点
  382. function BaseItem:CreateItem( class_name, parent, layer_name, ... )
  383. if class_name and parent then
  384. local item = class_name.New(parent, nil, layer_name, ... )
  385. self:AutoDelete( item )
  386. return item
  387. end
  388. end
  389. --自销毁动作
  390. function BaseItem:AddAction( action, node )
  391. self.action_nodes = self.action_nodes or {}
  392. self.action_nodes[node] = node
  393. --table.insert(self.action_nodes, node)
  394. cc.ActionManager:getInstance():addAction(action, node)
  395. end
  396. --自销毁特效
  397. function BaseItem:CreateUIEffect( config )
  398. if not config or not config.uiTranform then return end
  399. self.effect_nodes = self.effect_nodes or {}
  400. self:AddUIEffectConfig( config )
  401. table.insert(self.effect_nodes, config.uiTranform)
  402. end
  403. --播放界面入场动画
  404. function BaseItem:DoOpenAni(tab_id)
  405. tab_id = tab_id or 1
  406. self.ani_list = self.ani_list or {}
  407. if not self.is_loaded or self.ani_list[tab_id] then return end
  408. self.ani_list[tab_id] = true
  409. self:DoOpenViewAnimation()
  410. end
  411. function BaseItem:InitViewAnimation()
  412. if self.full_screen or self.ani_left or self.ani_right then
  413. --处理刘海屏的位移偏移
  414. local width, offset = self:GetIpxOffset()
  415. --右侧
  416. self.ani_right_trans = self:GetChild("right")
  417. if self.ani_right_trans then
  418. self.ani_right_obj = self:GetChild("right").gameObject
  419. self.old_ani_right_pos = self.ani_right_trans.anchoredPosition
  420. if self.ani_right and ClientConfig.view_ani_mode == true then
  421. SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + 600, self.old_ani_right_pos.y)
  422. else
  423. SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y)
  424. end
  425. end
  426. --左侧
  427. self.ani_left_trans = self:GetChild("left")
  428. if self.ani_left_trans then
  429. self.ani_left_obj = self:GetChild("left").gameObject
  430. self.old_ani_left_pos = self.ani_left_trans.anchoredPosition
  431. if self.ani_left and ClientConfig.view_ani_mode == true then
  432. SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x - 600 , self.old_ani_left_pos.y)
  433. else
  434. SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset , self.old_ani_left_pos.y)
  435. end
  436. end
  437. --中间
  438. self:ResetMidNode()
  439. --设置界面大小
  440. local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width)
  441. local rt = self.gameObject:GetComponent("RectTransform")
  442. rt.sizeDelta = Vector2(MaxScreenWidth, ScreenHeight)
  443. end
  444. end
  445. --处理界面动画
  446. function BaseItem:DoOpenViewAnimation()
  447. local width, offset = self:GetIpxOffset()
  448. if self.ani_right and self.ani_right_trans and ClientConfig.view_ani_mode == true then
  449. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans)
  450. SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + self.ani_right - offset, self.old_ani_right_pos.y)
  451. local moveActionRight = cc.MoveTo.createAnchoredType(1, self.old_ani_right_pos.x - offset, self.ani_right_trans.anchoredPosition.y)
  452. moveActionRight = cc.EaseExponentialOut.New(moveActionRight)
  453. self:AddAction(moveActionRight, self.ani_right_trans)
  454. end
  455. if self.ani_left and self.ani_left_trans and ClientConfig.view_ani_mode == true then
  456. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans)
  457. SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + self.ani_left + offset, self.old_ani_left_pos.y)
  458. local moveActionLeft = cc.MoveTo.createAnchoredType(1, self.old_ani_left_pos.x + offset, self.ani_left_trans.anchoredPosition.y)
  459. moveActionLeft = cc.EaseExponentialOut.New(moveActionLeft)
  460. self:AddAction(moveActionLeft, self.ani_left_trans)
  461. end
  462. end
  463. --获取刘海屏位移
  464. function BaseItem:GetIpxOffset()
  465. local width, offset = 0, 0
  466. if ClientConfig.iphone_x_offset_left ~= 0 then
  467. offset = ClientConfig.iphone_x_offset_left/2
  468. width = ClientConfig.iphone_x_offset_left
  469. elseif ClientConfig.iphone_x_offset_right then
  470. offset = -ClientConfig.iphone_x_offset_right/2
  471. width = ClientConfig.iphone_x_offset_right
  472. end
  473. return width, offset
  474. end
  475. --处理中间节点
  476. function BaseItem:ResetMidNode()
  477. if self.adjust_mid then
  478. local width, offset = self:GetIpxOffset()
  479. local MaxScreenWidth = math.min(SrcScreenWidth - width, 1560 - width)
  480. self.mid_trans = self:GetChild("mid")
  481. if self.mid_trans then
  482. self.adjust_mid.left = self.adjust_mid.left or 0
  483. self.adjust_mid.right = self.adjust_mid.right or 0
  484. local x = MaxScreenWidth - self.adjust_mid.left - self.adjust_mid.right
  485. x = x / 2
  486. SetAnchoredPosition(self.mid_trans, - (MaxScreenWidth / 2) + self.adjust_mid.left + x + offset, self.mid_trans.anchoredPosition.y)
  487. end
  488. end
  489. end
  490. --处理刘海屏,旋转屏幕
  491. function BaseItem:SetIpxMode()
  492. self:ResetMidNode()
  493. local width, offset = self:GetIpxOffset()
  494. if self.ani_right_trans then
  495. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_right_trans)
  496. SetAnchoredPosition(self.ani_right_trans, self.old_ani_right_pos.x + offset, self.old_ani_right_pos.y)
  497. end
  498. if self.ani_left_trans then
  499. cc.ActionManager:getInstance():removeAllActionsFromTarget(self.ani_left_trans)
  500. SetAnchoredPosition(self.ani_left_trans, self.old_ani_left_pos.x + offset, self.old_ani_left_pos.y)
  501. end
  502. end
  503. --把界面的UI节点移动到背景层
  504. function BaseItem:MoveUIToBack(...)
  505. self.move_node_list = self.move_node_list or {}
  506. local parms = {...}
  507. if not self.parent_view_target then
  508. self.cache_move_node_list = self.cache_move_node_list or {}
  509. table.insert(self.cache_move_node_list, parms)
  510. return
  511. end
  512. local node = parms[1]
  513. local args = parms[2]
  514. local camera_args = parms[3]
  515. local activity_args = parms[4]
  516. local targt_view = self.parent_view_target
  517. if node then
  518. local t = {node = node, args = args, parent = node.transform.parent, sibling_idx = node.transform:GetSiblingIndex()}
  519. table.insert(self.move_node_list, t)
  520. LuaViewManager:getInstance():ShowBackData({
  521. target = targt_view,
  522. node_list ={[1] = t},
  523. camera_args = camera_args,
  524. activity = activity_args,
  525. })
  526. end
  527. end
  528. --把界面的UI节点从背景层中移除
  529. function BaseItem:RemoveUIFromBack()
  530. self.move_node_list = self.move_node_list or {}
  531. if #self.move_node_list > 0 then
  532. LuaViewManager:getInstance():HideBackData(self)
  533. end
  534. end
  535. --根据界面状态显示隐藏在背景层中的UI
  536. function BaseItem:SetBackUIVisible(state, from_view)
  537. if self.move_node_list then
  538. for k,v in pairs(self.move_node_list) do
  539. if from_view then
  540. if state then
  541. if v.is_hide_form_view then
  542. v.is_hide_form_view = nil
  543. v.node.gameObject:SetActive(state)
  544. end
  545. else
  546. if v.node.gameObject.activeSelf then
  547. v.is_hide_form_view = true
  548. v.node.gameObject:SetActive(state)
  549. end
  550. end
  551. else
  552. v.node.gameObject:SetActive(state)
  553. end
  554. end
  555. end
  556. end
  557. function BaseItem:AppendToBackContainer(parent_view)
  558. if parent_view then
  559. self.parent_view_target = parent_view
  560. parent_view:AppendToBackContainer(self)
  561. if self.cache_move_node_list then
  562. for i,v in ipairs(self.cache_move_node_list) do
  563. self:MoveUIToBack(unpack(v))
  564. end
  565. self.cache_move_node_list = false
  566. end
  567. end
  568. end