scene_page.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. import { _decorator, Color, Component, instantiate, misc, Node, Prefab, Size, Sprite, tween, Tween, UIOpacity, UITransform, Vec3, Widget } from 'cc';
  2. import { ani_frame, att_ani_data, attributes_data, event_item, 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) content:Node = null;
  22. @property(Node) maskView:Node = null;
  23. @property(Prefab) widget_click_prefab:Prefab = null;
  24. @property(Prefab) widget_drag_prefab:Prefab = null;
  25. @property(Prefab) widget_slide_prefab:Prefab = null;
  26. @property(Prefab) widget_img_prefab:Prefab = null;
  27. @property(Prefab) widget_animation_prefab:Prefab = null;
  28. private mData:scene_item_data = null;
  29. private mIsMask:boolean = false;
  30. private mSceneAtt:attributes_data = null;
  31. private mWidgetList:Map<number,Node> = new Map;
  32. private bindTarget:BindTarget = null;
  33. protected mAnimationList:att_ani_data[] = []; //动画组
  34. protected mCurRunAnimation:ani_frame[] = [];
  35. protected mCurAnimation:att_ani_data = null;
  36. protected mPlayStatus:boolean = false;
  37. public initView(page_data:scene_item_data){
  38. this.mData = page_data;
  39. this.mIsMask = this.mData.is_check_mask;
  40. this.mSceneAtt = this.mData.att;
  41. if(this.mData.is_full_screen){
  42. this.content.getComponent(Widget).enabled = true;
  43. }else{
  44. this.content.getComponent(Widget).enabled = false;
  45. }
  46. this.mAnimationList = this.mSceneAtt.animation_list;
  47. console.log("scene_page this.mAnimationList", this.mAnimationList)
  48. if(this.mIsMask){
  49. this.maskView.active = true;
  50. }else{
  51. this.maskView.active = false;
  52. }
  53. this.initViewAtt()
  54. ClientEvent.on(config.EventRun.NOTICE_EVENT,this.widgetBeActive.bind(this),this)
  55. ClientEvent.on(config.EventRun.SHOW_ZHAO_BU_TONG_FINISH_STATUS,this.on_zhao_bu_tong_finish.bind(this),this)
  56. ClientEvent.on(config.EventRun.ON_ZHAO_BU_TONG_ALL_FINISH,this.on_zhao_bu_tong_all_finish.bind(this),this)
  57. }
  58. public checkFinish(widget_id:number):boolean{
  59. let widget = this.mWidgetList.get(widget_id)
  60. if(!widget){
  61. tools.showToast("配置监听其他控件错误")
  62. return true
  63. }
  64. return widget.getComponent(widget_base).getIsFinish();
  65. }
  66. public checkShow(widget_id:number):boolean{
  67. let widget = this.mWidgetList.get(widget_id)
  68. if(!widget){
  69. return true
  70. }
  71. return widget.getComponent(widget_base).getIsShow();
  72. }
  73. protected onDestroy(): void {
  74. this.mWidgetList.clear()
  75. ClientEvent.off(config.EventRun.SHOW_ZHAO_BU_TONG_FINISH_STATUS,this.on_zhao_bu_tong_finish.bind(this),this)
  76. ClientEvent.off(config.EventRun.ON_ZHAO_BU_TONG_ALL_FINISH,this.on_zhao_bu_tong_all_finish.bind(this),this)
  77. ClientEvent.off(config.EventRun.NOTICE_EVENT,this.widgetBeActive.bind(this),this)
  78. }
  79. widgetBeActive(widgetId:number,event:event_item){
  80. let item = this.mWidgetList.get(widgetId)
  81. if(item){
  82. item.getComponent(widget_base).beActive(widgetId,event)
  83. }
  84. console.log("scene_page =",event.type)
  85. if(event.type===config.event_type.scene_ani){
  86. let ani_id = event.event_item_scene_ani.ani_id;
  87. this.mCurAnimation = this.getAniById(ani_id)
  88. if(this.mCurAnimation){
  89. this.mCurRunAnimation = this.mCurAnimation.ani_frame_list;
  90. if(this.mCurRunAnimation.length<2){
  91. }else{
  92. this.runAnimation()
  93. }
  94. }else{
  95. return tools.showToast(`错误的动画配置!id:${this.mData.att.id}-请检查`)
  96. }
  97. }else if(event.type===config.event_type.delete_drag_other_data){
  98. let wd = event.event_item_delete_drag_other_data.widget_id
  99. let index = event.event_item_delete_drag_other_data.delete_drag_other_index
  100. item = this.mWidgetList.get(wd)
  101. if(item){
  102. item.getComponent(widget_drag).deleteOtherDrag(index)
  103. }else{
  104. tools.showToast("删除拖拽目标配置错误!")
  105. }
  106. this.eventWidgetMoreDeleteDragOtheList(event.event_item_delete_drag_other_data, event)
  107. }else if(event.type===config.event_type.active_event) {
  108. let data = event.event_item_active_event_data
  109. this.eventMoreBindingWidgetList(data, event)
  110. }else if(event.type===config.event_type.stop_active_event) {
  111. let data = event.event_item_stop_active_event_data
  112. this.eventMoreBindingWidgetList(data, event)
  113. }else if(event.type===config.event_type.hide) {
  114. let data = event.event_item_hide_data
  115. this.eventMoreBindingWidgetList(data, event)
  116. }
  117. }
  118. eventMoreBindingWidgetList(data, event:event_item) {
  119. if(data!=null) {
  120. if(data.binding_widget_list==null||data.binding_widget_list.length==0) {
  121. return
  122. }
  123. for(let i=0;i<data.binding_widget_list.length;i++) {
  124. const element = data.binding_widget_list[i]
  125. let e_widget_id = element.binding_widget_id
  126. let e_item = this.mWidgetList.get(e_widget_id)
  127. if(e_widget_id!=-1){
  128. if(e_item){
  129. e_item.getComponent(widget_base).beActive(e_widget_id,event)
  130. }
  131. }
  132. }
  133. }
  134. }
  135. eventWidgetMoreDeleteDragOtheList(data, event:event_item) {
  136. if(data!=null) {
  137. if(data.widget_list==null||data.widget_list.length==0) {
  138. return
  139. }
  140. for(let i=0;i<data.widget_list.length;i++) {
  141. const element = data.widget_list[i]
  142. let wd = element.widget_id
  143. let index = element.delete_drag_other_index
  144. if(index!=-1) {
  145. let e_item = this.mWidgetList.get(wd)
  146. if(e_item){
  147. e_item.getComponent(widget_drag).deleteOtherDrag(index)
  148. }
  149. }
  150. }
  151. }
  152. }
  153. on_zhao_bu_tong_finish(widget:zhao_xi_jie_item_data){
  154. let item = this.mWidgetList.get(widget.widget_id)
  155. if(item===null){
  156. return tools.showToast("配置找茬错误!")
  157. }
  158. item.getComponent(widget_base).showZhaoButongFinishStatus()
  159. }
  160. on_zhao_bu_tong_all_finish(data: zhao_xi_jie_data) {
  161. let delay_time = zhao_xi_jie_data.finish_widget_hidden_delay_time * 1000
  162. setTimeout(()=> {
  163. let widget_list = gameManager.getWidgetList(this.mData)
  164. for (let index = 0; index < widget_list.length; index++) {
  165. const widget_data = widget_list[index];
  166. if(widget_data.type == config.Widget_Type_List.CLICK_TYPE ||
  167. widget_data.type == config.Widget_Type_List.SLIDE_TYPE ||
  168. widget_data.type == config.Widget_Type_List.DRAG_TYPE) {
  169. let item = this.mWidgetList.get(widget_data.att.id)
  170. item.getComponent(widget_base).hideZhaoButongFinishStatus()
  171. }
  172. }
  173. }, delay_time)
  174. }
  175. public initViewAtt(){
  176. if(this.mData.is_full_screen){
  177. }else{
  178. this.initPos()
  179. this.initSize()
  180. }
  181. this.initBG()
  182. this.initWidgetList()
  183. }
  184. public initWidgetList(){
  185. let widget_list = gameManager.getWidgetList(this.mData).sort((a,b)=>{
  186. return a.att.z - b.att.z;
  187. })
  188. let is_dai_dao_ju_drag = (id:number)=>{
  189. let task:guo_ju_qing_dai_dao_ju =gameManager.Singleton.mSceneManager.getSceneTask()._guo_ju_qing_dai_dao_ju;
  190. if(task==null){
  191. return false;
  192. }
  193. for (let index = 0; index < task.widget_list.length; index++) {
  194. const element = task.widget_list[index];
  195. if(id==element.widget_id){
  196. return true
  197. }
  198. }
  199. return false;
  200. }
  201. for (let index = 0; index < widget_list.length; index++) {
  202. const widget_data = widget_list[index];
  203. let item:Node = null;
  204. switch (widget_data.type) {
  205. case config.Widget_Type_List.CLICK_TYPE:
  206. item = instantiate(this.widget_click_prefab)
  207. break;
  208. case config.Widget_Type_List.SLIDE_TYPE:
  209. item = instantiate(this.widget_slide_prefab)
  210. break;
  211. case config.Widget_Type_List.DRAG_TYPE:
  212. if(is_dai_dao_ju_drag(widget_data.att.id)){
  213. }else{
  214. item = instantiate(this.widget_drag_prefab)
  215. }
  216. break;
  217. case config.Widget_Type_List.IMG_TYPE:
  218. item = instantiate(this.widget_img_prefab)
  219. break;
  220. case config.Widget_Type_List.ACTION_TYPE:
  221. item = instantiate(this.widget_animation_prefab)
  222. break;
  223. }
  224. if(item){
  225. let com = item.getComponent(widget_base);
  226. if(com===null){
  227. console.log("error--widget_data.type:",widget_data.type)
  228. }else{
  229. item.name =`type${widget_data.type}-id${ widget_data.att.id}`
  230. com.initView(widget_data)
  231. item.parent = this.content;
  232. this.mWidgetList.set(widget_data.att.id,item)
  233. }
  234. }
  235. }
  236. }
  237. public initBG(){
  238. if(this.mSceneAtt.src.length>0){
  239. tools.loadUrl(this.mSceneAtt.src,this.content.getComponent(Sprite))
  240. }
  241. }
  242. public initSize(){
  243. this.content.getComponent(UITransform).contentSize = new Size(this.mSceneAtt.width,this.mSceneAtt.height)
  244. }
  245. public initPos(){
  246. this.content.position = new Vec3(this.mSceneAtt.x,this.mSceneAtt.y)
  247. }
  248. runAnimation(){
  249. if(this.bindTarget!=null){
  250. Tween.stopAllByTarget(this.bindTarget)
  251. this.bindTarget = null;
  252. }
  253. // Tween.stopAll()
  254. let getFrameData = (index)=>{
  255. let cur_frame:ani_frame =this.mCurRunAnimation[index];
  256. let up_frame:ani_frame = index>0?this.mCurRunAnimation[index-1]:this.mCurRunAnimation[0];
  257. return {"cur_frame":cur_frame,"up_frame":up_frame}
  258. }
  259. let cur_index = 0;
  260. let data = getFrameData(cur_index);
  261. let call_back = ()=>{
  262. cur_index++;
  263. if(cur_index>=this.mCurRunAnimation.length){
  264. if(this.mCurAnimation.isLoop){
  265. cur_index = 0;
  266. }else{
  267. this.mPlayStatus = false;
  268. return;
  269. }
  270. }
  271. let data = getFrameData(cur_index);
  272. this.runFrame(data.cur_frame,data.up_frame,call_back)
  273. }
  274. this.runFrame(data.cur_frame,data.up_frame,call_back)
  275. }
  276. runFrame(frame:ani_frame,up_frame:ani_frame,call){
  277. let self = this;
  278. let tweenDuration: number = frame.next_time;
  279. // this.content.getComponent(Sprite).spriteFrame = gameManager.getCacheSpriteFrameByName(frame.url)
  280. let n_pos:Vec3 = new Vec3(frame.pos_x,frame.pos_y)
  281. let _color = new Color()
  282. _color = _color.fromHEX(frame.color)
  283. this.bindTarget = new BindTarget();
  284. let rotation = up_frame.rotation == undefined?0:up_frame.rotation
  285. this.bindTarget.rotation = rotation
  286. this.bindTarget.color = new Color().fromHEX(up_frame.color)
  287. this.bindTarget.opacity = up_frame.transparent;
  288. this.bindTarget.size = new Size(up_frame.size_width,up_frame.size_height)
  289. this.bindTarget.pos = new Vec3(up_frame.pos_x,up_frame.pos_y)
  290. this.bindTarget.anchorPointX = up_frame.anchor_point_x==undefined?0.5:up_frame.anchor_point_x
  291. this.bindTarget.anchorPointY = up_frame.anchor_point_y==undefined?0.5:up_frame.anchor_point_y
  292. let color_opactiy_tw_size = tween(this.bindTarget)
  293. .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 }, {
  294. onUpdate(tar:BindTarget){
  295. self.content.getComponent(Sprite).color = tar.color;
  296. self.content.getComponent(UIOpacity).opacity = tar.opacity;
  297. // self.content.getComponent(UITransform).setContentSize(tar.size)
  298. self.content.position = tar.pos
  299. self.content.angle = tar.rotation;
  300. self.content.getComponent(UITransform).setAnchorPoint(tar.anchorPointX, tar.anchorPointY)
  301. }
  302. }).call(()=>{
  303. call()
  304. });
  305. color_opactiy_tw_size.start();
  306. }
  307. private getAniById(id:number){
  308. if(this.mAnimationList.length>0){
  309. for (let index = 0; index < this.mAnimationList.length; index++) {
  310. const element = this.mAnimationList[index];
  311. if(id==element.ani_id){
  312. return element;
  313. }
  314. }
  315. }
  316. return null;
  317. }
  318. }