scene_page.ts 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. import { _decorator, color, Color, Component, instantiate, misc, Node, Prefab, ScrollView, Size, Sprite, tween, Tween, UIOpacity, UITransform, Vec3, Widget } from 'cc';
  2. import { ani_frame, att_ani_data, attributes_data, event_item, event_item_delete_drag_other, guo_ju_qing_dai_dao_ju, scene_item_data, widget_item_data, zhao_xi_jie_data, zhao_xi_jie_item_data } from '../../data/data';
  3. import { config } from '../config';
  4. import { tools } from '../tools';
  5. import { gameManager } from './gameManager';
  6. import { widget_base } from './widget/widget_base';
  7. import { ClientEvent } from '../clientEvent';
  8. import { widget_drag } from './widget/widget_drag';
  9. const { ccclass, property } = _decorator;
  10. class BindTarget{
  11. color : Color;
  12. opacity:number;
  13. size:Size;
  14. pos:Vec3;
  15. rotation:number;
  16. anchorPointX:number;
  17. anchorPointY:number;
  18. }
  19. @ccclass('scene_page')
  20. export class scene_page extends Component {
  21. @property(Node) scroll_view:Node = null;
  22. @property(Node) content:Node = null;
  23. @property(Node) maskView:Node = null;
  24. @property(Prefab) widget_click_prefab:Prefab = null;
  25. @property(Prefab) widget_drag_prefab:Prefab = null;
  26. @property(Prefab) widget_slide_prefab:Prefab = null;
  27. @property(Prefab) widget_img_prefab:Prefab = null;
  28. @property(Prefab) widget_container_prefab:Prefab = null;
  29. @property(Prefab) widget_animation_prefab:Prefab = null;
  30. private mData:scene_item_data = null;
  31. private mIsMask:boolean = false;
  32. private mSceneAtt:attributes_data = null;
  33. private mWidgetList:Map<number,Node> = new Map;
  34. private bindTarget:BindTarget = null;
  35. protected mAnimationList:att_ani_data[] = []; //动画组
  36. protected mCurRunAnimation:ani_frame[] = [];
  37. protected mCurAnimation:att_ani_data = null;
  38. protected mPlayStatus:boolean = false;
  39. public initView(page_data:scene_item_data){
  40. this.mData = page_data;
  41. this.mIsMask = this.mData.is_check_mask;
  42. this.mSceneAtt = this.mData.att;
  43. if(this.mData.is_full_screen){
  44. this.content.getComponent(Widget).enabled = true;
  45. }else{
  46. this.content.getComponent(Widget).enabled = false;
  47. }
  48. this.content.position = Vec3.ZERO;
  49. this.mAnimationList = this.mSceneAtt.animation_list;
  50. console.log(" this.mAnimationList", this.mAnimationList)
  51. if(this.mIsMask){
  52. this.maskView.active = true;
  53. }else{
  54. this.maskView.active = false;
  55. }
  56. this.initViewAtt()
  57. ClientEvent.on(config.EventRun.NOTICE_EVENT,this.widgetBeActive.bind(this),this)
  58. ClientEvent.on(config.EventRun.SHOW_ZHAO_BU_TONG_FINISH_STATUS,this.on_zhao_bu_tong_finish.bind(this),this)
  59. ClientEvent.on(config.EventRun.ON_ZHAO_BU_TONG_ALL_FINISH,this.on_zhao_bu_tong_all_finish.bind(this),this)
  60. }
  61. public checkFinish(widget_id:number):boolean{
  62. let widget = this.mWidgetList.get(widget_id)
  63. if(!widget){
  64. tools.showToast("配置监听其他控件错误")
  65. return true
  66. }
  67. return widget.getComponent(widget_base).getIsFinish();
  68. }
  69. public checkShow(widget_id:number):boolean{
  70. let widget = this.mWidgetList.get(widget_id)
  71. if(!widget){
  72. return true
  73. }
  74. return widget.getComponent(widget_base).getIsShow();
  75. }
  76. protected onDestroy(): void {
  77. this.mWidgetList.clear()
  78. ClientEvent.off(config.EventRun.SHOW_ZHAO_BU_TONG_FINISH_STATUS,this.on_zhao_bu_tong_finish.bind(this),this)
  79. ClientEvent.off(config.EventRun.NOTICE_EVENT,this.widgetBeActive.bind(this),this)
  80. ClientEvent.off(config.EventRun.ON_ZHAO_BU_TONG_ALL_FINISH,this.on_zhao_bu_tong_all_finish.bind(this),this)
  81. }
  82. widgetBeActive(widgetId:number,event:event_item){
  83. let item = this.mWidgetList.get(widgetId)
  84. if(item){
  85. item.getComponent(widget_base).beActive(widgetId,event)
  86. }
  87. console.log("event.type",event.type)
  88. if(event.type===config.event_type.scene_ani){
  89. let ani_id = event.event_item_scene_ani.ani_id;
  90. this.mCurAnimation = this.getAniById(ani_id)
  91. if(this.mCurAnimation){
  92. this.mCurRunAnimation = this.mCurAnimation.ani_frame_list;
  93. if(this.mCurRunAnimation.length<2){
  94. }else{
  95. this.runAnimation()
  96. }
  97. }else{
  98. return tools.showToast(`错误的动画配置!id:${this.mData.att.id}-请检查`)
  99. }
  100. }else if(event.type===config.event_type.delete_drag_other_data){
  101. this.eventDeleteDragOtherData(event)
  102. }else if(event.type===config.event_type.active_event) {
  103. let data = event.event_item_active_event_data
  104. this.eventMoreBindingWidgetList(data, event)
  105. }else if(event.type===config.event_type.stop_active_event) {
  106. let data = event.event_item_stop_active_event_data
  107. this.eventMoreBindingWidgetList(data, event)
  108. }else if(event.type===config.event_type.hide) {
  109. let data = event.event_item_hide_data
  110. this.eventMoreBindingWidgetList(data, event)
  111. }
  112. }
  113. eventDeleteDragOtherData(event:event_item){
  114. let wd = event.event_item_delete_drag_other_data.widget_id
  115. let index = event.event_item_delete_drag_other_data.delete_drag_other_index
  116. let other_widget_list = event.event_item_delete_drag_other_data.widget_list
  117. if(other_widget_list.length==0) {
  118. let item = this.mWidgetList.get(wd)
  119. if(item){
  120. item.getComponent(widget_drag).deleteOtherDrag(index)
  121. }else{
  122. // tools.showToast("删除拖拽目标配置错误!")
  123. }
  124. } else {
  125. let data_list:event_item_delete_drag_other[] = JSON.parse(JSON.stringify(other_widget_list))
  126. if(wd!=-1) {
  127. let first_data = new event_item_delete_drag_other
  128. first_data.widget_id = wd
  129. first_data.delete_drag_other_index = index
  130. data_list.unshift(first_data)
  131. }
  132. for(let i=0;i<data_list.length;i++) {
  133. const element = data_list[i]
  134. let wd = element.widget_id
  135. let index = element.delete_drag_other_index
  136. let item = this.mWidgetList.get(wd)
  137. if(item) {
  138. item.getComponent(widget_drag).deleteOtherDrag(index)
  139. }
  140. }
  141. }
  142. }
  143. eventMoreBindingWidgetList(data, event:event_item) {
  144. if(data!=null) {
  145. if(data.binding_widget_list==null||data.binding_widget_list.length==0) {
  146. return
  147. }
  148. for(let i=0;i<data.binding_widget_list.length;i++) {
  149. const element = data.binding_widget_list[i]
  150. let e_widget_id = element.binding_widget_id
  151. let e_item = this.mWidgetList.get(e_widget_id)
  152. if(e_widget_id!=-1){
  153. if(e_item){
  154. e_item.getComponent(widget_base).beActive(e_widget_id,event)
  155. }
  156. }
  157. }
  158. }
  159. }
  160. on_zhao_bu_tong_finish(widget:zhao_xi_jie_item_data){
  161. let item = this.mWidgetList.get(widget.widget_id)
  162. if(!item){
  163. // tools.showToast("配置找茬错误!")
  164. return
  165. }
  166. item.getComponent(widget_base).showZhaoButongFinishStatus()
  167. }
  168. on_zhao_bu_tong_all_finish(data: zhao_xi_jie_data) {
  169. this.mWidgetList.forEach((n,k)=>{
  170. const widget_data = n.getComponent(widget_base).getData()
  171. if(widget_data.type == config.Widget_Type_List.CLICK_TYPE ||
  172. widget_data.type == config.Widget_Type_List.SLIDE_TYPE ||
  173. widget_data.type == config.Widget_Type_List.DRAG_TYPE) {
  174. n.getComponent(widget_base).hideZhaoButongFinishStatus()
  175. }
  176. })
  177. // let widget_list = gameManager.getWidgetList(this.mData)
  178. // for (let index = 0; index < widget_list.length; index++) {
  179. // const widget_data = widget_list[index];
  180. // if(widget_data.type == config.Widget_Type_List.CLICK_TYPE ||
  181. // widget_data.type == config.Widget_Type_List.SLIDE_TYPE ||
  182. // widget_data.type == config.Widget_Type_List.DRAG_TYPE) {
  183. // let item = this.mWidgetList.get(widget_data.att.id)
  184. // item.getComponent(widget_base).hideZhaoButongFinishStatus()
  185. // }
  186. // }
  187. }
  188. public initViewAtt(){
  189. if(this.mData.is_full_screen){
  190. }else{
  191. this.initPos()
  192. this.initSize()
  193. }
  194. this.initBG()
  195. this.initWidgetList()
  196. }
  197. public initWidgetList(){
  198. let widget_list = gameManager.getWidgetList(this.mData).sort((a,b)=>{
  199. return a.att.z - b.att.z;
  200. })
  201. let is_dai_dao_ju_drag = (id:number)=>{
  202. let task:guo_ju_qing_dai_dao_ju =gameManager.Singleton.mSceneManager.getSceneTask()._guo_ju_qing_dai_dao_ju;
  203. if(task==null){
  204. return false;
  205. }
  206. for (let index = 0; index < task.widget_list.length; index++) {
  207. const element = task.widget_list[index];
  208. if(id==element.widget_id){
  209. return true
  210. }
  211. }
  212. return false;
  213. }
  214. for (let index = 0; index < widget_list.length; index++) {
  215. const widget_data = widget_list[index];
  216. let item:Node = null;
  217. switch (widget_data.type) {
  218. case config.Widget_Type_List.CLICK_TYPE:
  219. item = instantiate(this.widget_click_prefab)
  220. break;
  221. case config.Widget_Type_List.SLIDE_TYPE:
  222. item = instantiate(this.widget_slide_prefab)
  223. break;
  224. case config.Widget_Type_List.DRAG_TYPE:
  225. if(is_dai_dao_ju_drag(widget_data.att.id)){
  226. }else{
  227. item = instantiate(this.widget_drag_prefab)
  228. }
  229. break;
  230. case config.Widget_Type_List.CONTAINER_LAYER:
  231. item = instantiate(this.widget_container_prefab)
  232. break;
  233. case config.Widget_Type_List.IMG_TYPE:
  234. item = instantiate(this.widget_img_prefab)
  235. break;
  236. case config.Widget_Type_List.ACTION_TYPE:
  237. item = instantiate(this.widget_animation_prefab)
  238. break;
  239. }
  240. if(item) {
  241. let com = item.getComponent(widget_base);
  242. if(com===null){
  243. console.log("error--widget_data.type:",widget_data.type)
  244. }else{
  245. item.name =`type${widget_data.type}-id${ widget_data.att.id}`
  246. com.initView(widget_data)
  247. item.parent = this.content;
  248. this.mWidgetList.set(widget_data.att.id,item)
  249. }
  250. //新增加容器控件
  251. if(widget_data.type==config.Widget_Type_List.CONTAINER_LAYER&&com!=null){
  252. this.initContainerWidgetList(com.getIcon(),widget_data.att.container_layer.widget_list)
  253. }
  254. }
  255. }
  256. }
  257. public initContainerWidgetList(container:Node,widget_list:widget_item_data[]){
  258. widget_list.sort((a,b)=>{
  259. return a.att.z - b.att.z;
  260. })
  261. let is_dai_dao_ju_drag = (id:number)=>{
  262. let task:guo_ju_qing_dai_dao_ju =gameManager.Singleton.mSceneManager.getSceneTask()._guo_ju_qing_dai_dao_ju;
  263. if(task==null){
  264. return false;
  265. }
  266. for (let index = 0; index < task.widget_list.length; index++) {
  267. const element = task.widget_list[index];
  268. if(id==element.widget_id){
  269. return true
  270. }
  271. }
  272. return false;
  273. }
  274. for (let index = 0; index < widget_list.length; index++) {
  275. const widget_data = widget_list[index];
  276. let item:Node = null;
  277. switch (widget_data.type) {
  278. case config.Widget_Type_List.CLICK_TYPE:
  279. item = instantiate(this.widget_click_prefab)
  280. break;
  281. case config.Widget_Type_List.SLIDE_TYPE:
  282. item = instantiate(this.widget_slide_prefab)
  283. break;
  284. case config.Widget_Type_List.DRAG_TYPE:
  285. if(is_dai_dao_ju_drag(widget_data.att.id)){
  286. }else{
  287. item = instantiate(this.widget_drag_prefab)
  288. }
  289. break;
  290. // case config.Widget_Type_List.CONTAINER_LAYER:
  291. // item = instantiate(this.widget_container_prefab)
  292. // break;
  293. case config.Widget_Type_List.IMG_TYPE:
  294. item = instantiate(this.widget_img_prefab)
  295. break;
  296. case config.Widget_Type_List.ACTION_TYPE:
  297. item = instantiate(this.widget_animation_prefab)
  298. break;
  299. }
  300. if(item){
  301. let com = item.getComponent(widget_base);
  302. if(com===null){
  303. console.log("error--widget_data.type:",widget_data.type)
  304. }else{
  305. item.name =`type${widget_data.type}-id${ widget_data.att.id}`
  306. com.initView(widget_data)
  307. item.parent =container;
  308. this.mWidgetList.set(widget_data.att.id,item)
  309. }
  310. }
  311. }
  312. }
  313. public getBG(){
  314. return this.content;
  315. }
  316. public initBG(){
  317. if(this.mSceneAtt.src.length>0){
  318. tools.loadUrl(this.mSceneAtt.src,this.content.getComponent(Sprite))
  319. }
  320. }
  321. public initSize(){
  322. this.content.getComponent(UITransform).contentSize = new Size(this.mSceneAtt.width,this.mSceneAtt.height)
  323. }
  324. public initPos(){
  325. this.content.position = new Vec3(this.mSceneAtt.x,this.mSceneAtt.y)
  326. }
  327. runAnimation(){
  328. if(this.bindTarget!=null){
  329. Tween.stopAllByTarget(this.bindTarget)
  330. this.bindTarget = null;
  331. }
  332. // Tween.stopAll()
  333. let getFrameData = (index)=>{
  334. let cur_frame:ani_frame =this.mCurRunAnimation[index];
  335. let up_frame:ani_frame = index>0?this.mCurRunAnimation[index-1]:this.mCurRunAnimation[0];
  336. return {"cur_frame":cur_frame,"up_frame":up_frame}
  337. }
  338. let cur_index = 0;
  339. let data = getFrameData(cur_index);
  340. let call_back = ()=>{
  341. cur_index++;
  342. if(cur_index>=this.mCurRunAnimation.length){
  343. if(this.mCurAnimation.isLoop){
  344. cur_index = 0;
  345. }else{
  346. this.mPlayStatus = false;
  347. return;
  348. }
  349. }
  350. let data = getFrameData(cur_index);
  351. this.runFrame(data.cur_frame,data.up_frame,call_back)
  352. }
  353. this.runFrame(data.cur_frame,data.up_frame,call_back)
  354. }
  355. runFrame(frame:ani_frame,up_frame:ani_frame,call){
  356. if(!frame || !up_frame) { return }
  357. let self = this;
  358. let tweenDuration: number = frame.next_time;
  359. // this.content.getComponent(Sprite).spriteFrame = gameManager.getCacheSpriteFrameByName(frame.url)
  360. let n_pos:Vec3 = new Vec3(frame.pos_x,frame.pos_y)
  361. let _color = new Color()
  362. _color = _color.fromHEX(frame.color)
  363. this.bindTarget = new BindTarget();
  364. let rotation = up_frame.rotation == undefined?0:up_frame.rotation
  365. this.bindTarget.rotation = rotation
  366. this.bindTarget.color = new Color().fromHEX(up_frame.color)
  367. this.bindTarget.opacity = up_frame.transparent;
  368. this.bindTarget.size = new Size(up_frame.size_width,up_frame.size_height)
  369. this.bindTarget.pos = new Vec3(up_frame.pos_x,up_frame.pos_y)
  370. this.bindTarget.anchorPointX = up_frame.anchor_point_x==undefined?0.5:up_frame.anchor_point_x
  371. this.bindTarget.anchorPointY = up_frame.anchor_point_y==undefined?0.5:up_frame.anchor_point_y
  372. let color_opactiy_tw_size = tween(this.bindTarget)
  373. .to( tweenDuration, { pos:n_pos,color: _color,opacity:frame.transparent,size:new Size(frame.size_width,frame.size_height),rotation:frame.rotation, anchorPointX:frame.anchor_point_x, anchorPointY:frame.anchor_point_y }, {
  374. onUpdate(tar:BindTarget){
  375. self.content.getComponent(Sprite).color = tar.color;
  376. self.content.getComponent(UIOpacity).opacity = tar.opacity;
  377. // self.content.getComponent(UITransform).setContentSize(tar.size)
  378. self.content.position = tar.pos
  379. self.content.angle = tar.rotation;
  380. self.content.getComponent(UITransform).setAnchorPoint(tar.anchorPointX, tar.anchorPointY)
  381. }
  382. }).call(()=>{
  383. call && call()
  384. });
  385. color_opactiy_tw_size.start();
  386. }
  387. public startScrollTouch(){
  388. if(this.maskView!=null){
  389. this.scroll_view.getComponent(ScrollView).horizontal = true
  390. this.scroll_view.getComponent(ScrollView).vertical = true
  391. }
  392. }
  393. public stopScrollTouch(){
  394. if(this.maskView!=null){
  395. this.scroll_view.getComponent(ScrollView).horizontal = false
  396. this.scroll_view.getComponent(ScrollView).vertical = false
  397. }
  398. }
  399. private getAniById(id:number){
  400. if(this.mAnimationList.length>0){
  401. for (let index = 0; index < this.mAnimationList.length; index++) {
  402. const element = this.mAnimationList[index];
  403. if(id==element.ani_id){
  404. return element;
  405. }
  406. }
  407. }
  408. return null;
  409. }
  410. }