widget_click.ts 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import { _decorator, Component, Node } from 'cc';
  2. import { widget_base } from './widget_base';
  3. import { att_click_data, other_widget_finish_listen_item, widget_item_data } from '../../../data/data';
  4. import { config } from '../../config';
  5. import { ClientEvent } from '../../clientEvent';
  6. import { gameManager } from '../gameManager';
  7. const { ccclass, property } = _decorator;
  8. @ccclass('widget_click')
  9. export class widget_click extends widget_base {
  10. @property(Node) img_zhaobutong:Node = null;
  11. private mClickData:att_click_data = null;
  12. private mClickNum:number = 0;
  13. private mClickTime:number =1; //1秒内完成点击
  14. private mHoldTime:number = 0; //按下的事件
  15. protected init(): void {
  16. if(this.mData.att.click_data!=null){
  17. this.mClickData = this.mData.att.click_data
  18. }
  19. }
  20. protected start(): void {
  21. if(this.mIsActive){
  22. this.registeredEvent()
  23. }
  24. }
  25. protected registeredEvent(): void {
  26. this.mHoldTime = 0;
  27. this.mClickNum = 0;
  28. switch (this.mClickData.click_type) {
  29. case config.clcik_type.Press_and_hold:
  30. this.node.on(Node.EventType.TOUCH_START,()=>{
  31. if(!this.mIsActive) return
  32. this.mHoldTime = 0;
  33. this.checkTime()
  34. this.schedule(this.checkTime,1)
  35. })
  36. this.node.on(Node.EventType.TOUCH_END,()=>{
  37. if(!this.mIsActive) return
  38. if(!this.getIsFinish()){
  39. this.mHoldTime = 0;
  40. this.unschedule(this.checkTime)
  41. }
  42. })
  43. break;
  44. case config.clcik_type.Multiple_clicks:
  45. this.node.on(Node.EventType.TOUCH_START,()=>{
  46. if(!this.mIsActive) return
  47. this.scheduleOnce(this.reSetClickNum,this.mClickTime);
  48. this.mClickNum++;
  49. if(this.mClickNum===this.mClickData.multiple_check_num){
  50. this.mClickNum = 0;
  51. this.unschedule(this.reSetClickNum)
  52. this.exeFinish()
  53. }
  54. })
  55. break;
  56. case config.clcik_type.click:
  57. this.node.off(Node.EventType.TOUCH_END)
  58. this.node.on(Node.EventType.TOUCH_END,()=>{
  59. if(!this.mIsActive) return
  60. this.exeFinish()
  61. })
  62. break;
  63. case config.clcik_type.click_not_auto_finish:
  64. this.node.off(Node.EventType.TOUCH_END)
  65. this.node.on(Node.EventType.TOUCH_END,()=>{
  66. if(!this.mIsActive) return
  67. ClientEvent.dispatchEvent(config.EventRun.WIDGET_FINISH,this.mData.att.id)
  68. })
  69. break;
  70. }
  71. }
  72. public exeFinish(){
  73. this.checkAddOtherWidgetFinishListenOperation()
  74. }
  75. private checkTime(){
  76. this.mHoldTime+=1;
  77. if(this.getIsFinish()){
  78. this.unschedule(this.checkTime)
  79. return
  80. }
  81. if(this.mClickData.hold_time<=this.mHoldTime){
  82. this.exeFinish()
  83. this.unschedule(this.checkTime)
  84. return
  85. }
  86. }
  87. private reSetClickNum(){
  88. this.mClickNum = 0;
  89. }
  90. public showZhaoButongFinishStatus(): void {
  91. gameManager.Singleton.sys_click_correct_detail_music()
  92. this.img_zhaobutong.active = true;
  93. }
  94. public hideZhaoButongFinishStatus(): void {
  95. if(this.img_zhaobutong != null) {
  96. this.img_zhaobutong.active = false;
  97. }
  98. }
  99. // 检查添加其他控件
  100. private checkAddOtherWidgetFinishListenOperation() {
  101. let onFinishEvent_cb = (()=>{
  102. this.checkOtherListenWidgetFinish(false)
  103. this.onFinishEvent()
  104. })
  105. if(this.checkOtherWidgetFinishListenListData()==false) {
  106. onFinishEvent_cb()
  107. return
  108. }
  109. // 是-直接执行自身
  110. if(this.mClickData.is_direct_execute_myself) {
  111. // console.log('直接-执行自身')
  112. onFinishEvent_cb()
  113. }
  114. // 否-直接执行自身
  115. else {
  116. // 是-选择其一执行自身
  117. let finish_list = this.checkOtherListenWidgetFinish(true)
  118. // console.log('完成的控件列表=',finish_list)
  119. if(this.mClickData.is_select_anyone_execute_myself) {
  120. let is_execute_myself = false
  121. for (let index = 0; index < finish_list.length; index++) {
  122. const element = finish_list[index];
  123. if(element.is_execute_myself) {
  124. is_execute_myself = true
  125. break
  126. }
  127. }
  128. if(is_execute_myself) {
  129. // console.log('满足其中一个条件-执行自身')
  130. onFinishEvent_cb()
  131. }
  132. }
  133. // 否-选择其一执行自身
  134. else {
  135. // 控件全部完成
  136. if(finish_list.length==this.mClickData.other_widget_finish_listen_list.length) {
  137. // console.log('控件全部完成-执行自身')
  138. onFinishEvent_cb()
  139. return
  140. }
  141. // 同时满足
  142. let execute_count = 0
  143. let have_count = 0
  144. for (let i = 0; i < this.mClickData.other_widget_finish_listen_list.length; i++) {
  145. const i_element = this.mClickData.other_widget_finish_listen_list[i]
  146. if(i_element.is_execute_myself) {
  147. execute_count+=1
  148. for (let j = 0; j < finish_list.length; j++) {
  149. const j_element = finish_list[j];
  150. if(i_element.widget_id==j_element.widget_id) {
  151. have_count+=1
  152. }
  153. }
  154. }
  155. }
  156. if(execute_count>0) {
  157. if(execute_count==have_count) {
  158. // console.log('同时满足条件-执行自身')
  159. onFinishEvent_cb()
  160. return
  161. }
  162. }
  163. }
  164. }
  165. // 未完成控件,执行监控事件
  166. this.checkOtherListenWidgetFinish(false)
  167. }
  168. private checkOtherWidgetFinishListenListData():boolean {
  169. if(this.mClickData.other_widget_finish_listen_list==undefined){
  170. return false
  171. }
  172. if(this.mClickData.other_widget_finish_listen_list.length<=0){
  173. return false
  174. }
  175. return true
  176. }
  177. private checkOtherListenWidgetFinish(is_finish_status:boolean):other_widget_finish_listen_item[]{
  178. if(this.checkOtherWidgetFinishListenListData()==false) {
  179. return []
  180. }
  181. let list = gameManager.Singleton.checkWidgetList(this.mClickData.other_widget_finish_listen_list,is_finish_status)
  182. if(is_finish_status==false&&list.length>0) {
  183. // for (let index = 0; index < list.length; index++) {
  184. // const event = list[index];
  185. // gameManager.Singleton.exeEvent(event.event_id)
  186. // }
  187. // console.log('list=',list)
  188. // 未完成:其中有2,只执行2; 没有2,所有1执行; 没有2&&没有1,所有0执行;
  189. let hight_list:other_widget_finish_listen_item[] = []
  190. let middle_list:other_widget_finish_listen_item[] = []
  191. let normal_list:other_widget_finish_listen_item[] = []
  192. for (let index = 0; index < list.length; index++) {
  193. const event = list[index];
  194. if(event.grade>=2) {
  195. hight_list.push(event)
  196. break
  197. } else if(event.grade==1) {
  198. middle_list.push(event)
  199. } else {
  200. normal_list.push(event)
  201. }
  202. }
  203. let exeEvent_cb = ((item_list:other_widget_finish_listen_item[])=>{
  204. for (let index = 0; index < item_list.length; index++) {
  205. const event = item_list[index];
  206. gameManager.Singleton.exeEvent(event.event_id)
  207. }
  208. })
  209. if(hight_list.length>0) {
  210. middle_list = []
  211. normal_list = []
  212. exeEvent_cb(hight_list)
  213. } else {
  214. if(middle_list.length>0) {
  215. normal_list = []
  216. exeEvent_cb(middle_list)
  217. } else {
  218. exeEvent_cb(normal_list)
  219. }
  220. }
  221. }
  222. return list;
  223. }
  224. }