widget_slide.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. import { _decorator, Component, EventTouch, Node, UITransform, Vec2, Vec3 } from 'cc';
  2. import { widget_base } from './widget_base';
  3. import { att_slide_data, other_widget_finish_listen_item, widget_item_data } from '../../../data/data';
  4. import { config } from '../../config';
  5. import { gameManager } from '../gameManager';
  6. const { ccclass, property } = _decorator;
  7. @ccclass('widget_slide')
  8. export class widget_slide extends widget_base {
  9. @property(Node) img_zhaobutong:Node = null;
  10. private mSlideData:att_slide_data = null;
  11. private mStartClickPos:Vec2 = null;
  12. private mCurSlideNum:number = 0;
  13. private mSlideFinishUp:boolean = false;
  14. private mSlideFinishDown:boolean = false;
  15. private mSlideFinishLeft:boolean = false;
  16. private mSlideFinishRight:boolean = false;
  17. protected init(){
  18. if(this.mData.att.slide_data!=null){
  19. this.mSlideData = this.mData.att.slide_data
  20. }
  21. }
  22. protected start(): void {
  23. if(this.mIsActive){
  24. this.registeredEvent()
  25. }
  26. }
  27. protected registeredEvent(): void {
  28. if( !this.mSlideData ){
  29. return
  30. }
  31. this.node.on(Node.EventType.TOUCH_START,(et:EventTouch)=>{
  32. if(!this.mIsActive) return
  33. this.mStartClickPos = et.getUILocation()
  34. })
  35. if(this.mSlideData.slide_dir==config.slide_type.up_down||this.mSlideData.slide_dir==config.slide_type.left_right){
  36. this.node.on(Node.EventType.TOUCH_END,()=>{
  37. if(!this.mIsActive) return
  38. this.mSlideFinishUp = false;
  39. this.mSlideFinishDown = false;
  40. this.mSlideFinishLeft = false;
  41. this.mSlideFinishRight = false;
  42. })
  43. this.node.on(Node.EventType.TOUCH_MOVE,(et:EventTouch)=>{
  44. if(!this.mIsActive) return
  45. let isFinish = false;
  46. let distance = this.mSlideData.slide_distance;
  47. let et_ =et.getUILocation()
  48. let p = new Vec3(et_.x,et_.y)
  49. let pos = this.node.parent.getComponent(UITransform).convertToNodeSpaceAR(p)
  50. switch (this.mSlideData.slide_dir) {
  51. case config.slide_type.up_down:
  52. let down_y = (this.node.position.y - distance*0.5);
  53. let up_y = (this.node.position.y + distance*0.5);
  54. if(pos.y>=up_y){
  55. this.mSlideFinishUp = true;
  56. }
  57. if(pos.y<=down_y){
  58. this.mSlideFinishDown = true;
  59. }
  60. if(this.mSlideFinishUp&&this.mSlideFinishDown){
  61. isFinish = true;
  62. this.mSlideFinishUp = false;
  63. this.mSlideFinishDown = false;
  64. }
  65. break;
  66. case config.slide_type.left_right:
  67. let left_x = (this.node.position.x - distance*0.5);
  68. let right_x = (this.node.position.x + distance*0.5);
  69. if(pos.x>=right_x){
  70. this.mSlideFinishRight = true;
  71. }
  72. if(pos.x<=left_x){
  73. this.mSlideFinishLeft = true;
  74. }
  75. if(this.mSlideFinishLeft&&this.mSlideFinishRight){
  76. isFinish = true;
  77. this.mSlideFinishLeft = false;
  78. this.mSlideFinishRight = false;
  79. }
  80. break;
  81. }
  82. if(isFinish){
  83. this.mCurSlideNum++;
  84. }
  85. if(this.mCurSlideNum>=this.mSlideData.slide_num){
  86. this.exeFinish()
  87. }
  88. })
  89. }else{
  90. this.node.on(Node.EventType.TOUCH_END,(et:EventTouch)=>{
  91. if(!this.mIsActive) return
  92. let isFinish = false;
  93. let endClickPos = et.getUILocation()
  94. switch (this.mSlideData.slide_dir) {
  95. case config.slide_type.up:
  96. if((endClickPos.y-this.mStartClickPos.y)>=this.mSlideData.slide_distance){
  97. isFinish = true;
  98. }
  99. break;
  100. case config.slide_type.down:
  101. if((this.mStartClickPos.y-endClickPos.y)>=this.mSlideData.slide_distance){
  102. isFinish = true;
  103. }
  104. break;
  105. case config.slide_type.left:
  106. if((this.mStartClickPos.x-endClickPos.x)>=this.mSlideData.slide_distance){
  107. isFinish = true;
  108. }
  109. break;
  110. case config.slide_type.right:
  111. if((endClickPos.x-this.mStartClickPos.x)>=this.mSlideData.slide_distance){
  112. isFinish = true;
  113. }
  114. break;
  115. }
  116. if(isFinish){
  117. this.exeFinish()
  118. }
  119. })
  120. }
  121. }
  122. public exeFinish(){
  123. this.checkAddOtherWidgetFinishListenOperation()
  124. }
  125. public initSlide(){
  126. this.mCurSlideNum = 0;
  127. this.mSlideFinishUp = false;
  128. this.mSlideFinishDown = false;
  129. this.mSlideFinishLeft = false;
  130. this.mSlideFinishRight = false;
  131. }
  132. public showZhaoButongFinishStatus(): void {
  133. gameManager.Singleton.sys_click_correct_detail_music()
  134. this.img_zhaobutong.active = true;
  135. }
  136. public hideZhaoButongFinishStatus(): void {
  137. if(this.img_zhaobutong != null) {
  138. this.img_zhaobutong.active = false;
  139. }
  140. }
  141. // 检查添加其他控件
  142. private checkAddOtherWidgetFinishListenOperation() {
  143. let onFinishEvent_cb = (()=>{
  144. this.checkOtherListenWidgetFinish(false)
  145. this.onFinishEvent()
  146. })
  147. if(this.checkOtherWidgetFinishListenListData()==false) {
  148. onFinishEvent_cb()
  149. return
  150. }
  151. // 是-直接执行自身
  152. if(this.mSlideData.is_direct_execute_myself) {
  153. // console.log('直接-执行自身')
  154. onFinishEvent_cb()
  155. }
  156. // 否-直接执行自身
  157. else {
  158. // 是-选择其一执行自身
  159. let finish_list = this.checkOtherListenWidgetFinish(true)
  160. // console.log('完成的控件列表=',finish_list)
  161. if(this.mSlideData.is_select_anyone_execute_myself) {
  162. let is_execute_myself = false
  163. for (let index = 0; index < finish_list.length; index++) {
  164. const element = finish_list[index];
  165. if(element.is_execute_myself) {
  166. is_execute_myself = true
  167. break
  168. }
  169. }
  170. if(is_execute_myself) {
  171. // console.log('满足其中一个条件-执行自身')
  172. onFinishEvent_cb()
  173. }
  174. }
  175. // 否-选择其一执行自身
  176. else {
  177. // 控件全部完成
  178. if(finish_list.length==this.mSlideData.other_widget_finish_listen_list.length) {
  179. // console.log('控件全部完成-执行自身')
  180. onFinishEvent_cb()
  181. return
  182. }
  183. // 同时满足
  184. let execute_count = 0
  185. let have_count = 0
  186. for (let i = 0; i < this.mSlideData.other_widget_finish_listen_list.length; i++) {
  187. const i_element = this.mSlideData.other_widget_finish_listen_list[i]
  188. if(i_element.is_execute_myself) {
  189. execute_count+=1
  190. for (let j = 0; j < finish_list.length; j++) {
  191. const j_element = finish_list[j];
  192. if(i_element.widget_id==j_element.widget_id) {
  193. have_count+=1
  194. }
  195. }
  196. }
  197. }
  198. if(execute_count>0) {
  199. if(execute_count==have_count) {
  200. // console.log('同时满足条件-执行自身')
  201. onFinishEvent_cb()
  202. return
  203. }
  204. }
  205. }
  206. }
  207. // 未完成控件,执行监控事件
  208. this.checkOtherListenWidgetFinish(false)
  209. }
  210. private checkOtherWidgetFinishListenListData():boolean {
  211. if(this.mSlideData.other_widget_finish_listen_list==undefined){
  212. return false
  213. }
  214. if(this.mSlideData.other_widget_finish_listen_list.length<=0){
  215. return false
  216. }
  217. return true
  218. }
  219. private checkOtherListenWidgetFinish(is_finish_status:boolean):other_widget_finish_listen_item[]{
  220. if(this.checkOtherWidgetFinishListenListData()==false) {
  221. return []
  222. }
  223. let list = gameManager.Singleton.checkWidgetList(this.mSlideData.other_widget_finish_listen_list,is_finish_status)
  224. if(is_finish_status==false&&list.length>0) {
  225. // for (let index = 0; index < list.length; index++) {
  226. // const event = list[index];
  227. // gameManager.Singleton.exeEvent(event.event_id)
  228. // }
  229. // console.log('list=',list)
  230. // 未完成:其中有2,只执行2; 没有2,所有1执行; 没有2&&没有1,所有0执行;
  231. let hight_list:other_widget_finish_listen_item[] = []
  232. let middle_list:other_widget_finish_listen_item[] = []
  233. let normal_list:other_widget_finish_listen_item[] = []
  234. for (let index = 0; index < list.length; index++) {
  235. const event = list[index];
  236. if(event.grade>=2) {
  237. hight_list.push(event)
  238. break
  239. } else if(event.grade==1) {
  240. middle_list.push(event)
  241. } else {
  242. normal_list.push(event)
  243. }
  244. }
  245. let exeEvent_cb = ((item_list:other_widget_finish_listen_item[])=>{
  246. for (let index = 0; index < item_list.length; index++) {
  247. const event = item_list[index];
  248. gameManager.Singleton.exeEvent(event.event_id)
  249. }
  250. })
  251. if(hight_list.length>0) {
  252. middle_list = []
  253. normal_list = []
  254. exeEvent_cb(hight_list)
  255. } else {
  256. if(middle_list.length>0) {
  257. normal_list = []
  258. exeEvent_cb(middle_list)
  259. } else {
  260. exeEvent_cb(normal_list)
  261. }
  262. }
  263. }
  264. return list;
  265. }
  266. }