widget_slide.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { _decorator, Component, EventTouch, Node, UITransform, Vec2, Vec3 } from 'cc';
  2. import { widget_base } from './widget_base';
  3. import { att_slide_data, widget_item_data } from '../../../data/data';
  4. import { config } from '../../config';
  5. const { ccclass, property } = _decorator;
  6. @ccclass('widget_slide')
  7. export class widget_slide extends widget_base {
  8. private mSlideData:att_slide_data = null;
  9. private mStartClickPos:Vec2 = null;
  10. private mCurSlideNum:number = 0;
  11. private mSlideFinishUp:boolean = false;
  12. private mSlideFinishDown:boolean = false;
  13. private mSlideFinishLeft:boolean = false;
  14. private mSlideFinishRight:boolean = false;
  15. protected init(){
  16. if(this.mData.att.slide_data!=null){
  17. this.mSlideData = this.mData.att.slide_data
  18. }
  19. }
  20. protected start(): void {
  21. if(this.mIsActive){
  22. this.registeredEvent()
  23. }
  24. }
  25. protected registeredEvent(): void {
  26. if( !this.mSlideData ){
  27. return
  28. }
  29. this.node.on(Node.EventType.TOUCH_START,(et:EventTouch)=>{
  30. if(!this.mIsActive) return
  31. this.mStartClickPos = et.getUILocation()
  32. })
  33. if(this.mSlideData.slide_dir==config.slide_type.up_down||this.mSlideData.slide_dir==config.slide_type.left_right){
  34. this.node.on(Node.EventType.TOUCH_END,()=>{
  35. if(!this.mIsActive) return
  36. this.mSlideFinishUp = false;
  37. this.mSlideFinishDown = false;
  38. this.mSlideFinishLeft = false;
  39. this.mSlideFinishRight = false;
  40. })
  41. this.node.on(Node.EventType.TOUCH_MOVE,(et:EventTouch)=>{
  42. if(!this.mIsActive) return
  43. let isFinish = false;
  44. let distance = this.mSlideData.slide_distance;
  45. let et_ =et.getUILocation()
  46. let p = new Vec3(et_.x,et_.y)
  47. let pos = this.node.parent.getComponent(UITransform).convertToNodeSpaceAR(p)
  48. switch (this.mSlideData.slide_dir) {
  49. case config.slide_type.up_down:
  50. let down_y = (this.node.position.y - distance*0.5);
  51. let up_y = (this.node.position.y + distance*0.5);
  52. if(pos.y>=up_y){
  53. this.mSlideFinishUp = true;
  54. }
  55. if(pos.y<=down_y){
  56. this.mSlideFinishDown = true;
  57. }
  58. if(this.mSlideFinishUp&&this.mSlideFinishDown){
  59. isFinish = true;
  60. this.mSlideFinishUp = false;
  61. this.mSlideFinishDown = false;
  62. }
  63. break;
  64. case config.slide_type.left_right:
  65. let left_x = (this.node.position.x - distance*0.5);
  66. let right_x = (this.node.position.x + distance*0.5);
  67. if(pos.x>=right_x){
  68. this.mSlideFinishRight = true;
  69. }
  70. if(pos.x<=left_x){
  71. this.mSlideFinishLeft = true;
  72. }
  73. if(this.mSlideFinishLeft&&this.mSlideFinishRight){
  74. isFinish = true;
  75. this.mSlideFinishLeft = false;
  76. this.mSlideFinishRight = false;
  77. }
  78. break;
  79. }
  80. if(isFinish){
  81. this.mCurSlideNum++;
  82. }
  83. if(this.mCurSlideNum>=this.mSlideData.slide_num){
  84. this.onFinishEvent()
  85. }
  86. })
  87. }else{
  88. this.node.on(Node.EventType.TOUCH_END,(et:EventTouch)=>{
  89. if(!this.mIsActive) return
  90. let isFinish = false;
  91. let endClickPos = et.getUILocation()
  92. switch (this.mSlideData.slide_dir) {
  93. case config.slide_type.up:
  94. if((endClickPos.y-this.mStartClickPos.y)>=this.mSlideData.slide_distance){
  95. isFinish = true;
  96. }
  97. break;
  98. case config.slide_type.down:
  99. if((this.mStartClickPos.y-endClickPos.y)>=this.mSlideData.slide_distance){
  100. isFinish = true;
  101. }
  102. break;
  103. case config.slide_type.left:
  104. if((this.mStartClickPos.x-endClickPos.x)>=this.mSlideData.slide_distance){
  105. isFinish = true;
  106. }
  107. break;
  108. case config.slide_type.right:
  109. if((endClickPos.x-this.mStartClickPos.x)>=this.mSlideData.slide_distance){
  110. isFinish = true;
  111. }
  112. break;
  113. }
  114. if(isFinish){
  115. this.onFinishEvent()
  116. }
  117. })
  118. }
  119. }
  120. public initSlide(){
  121. this.mCurSlideNum = 0;
  122. this.mSlideFinishUp = false;
  123. this.mSlideFinishDown = false;
  124. this.mSlideFinishLeft = false;
  125. this.mSlideFinishRight = false;
  126. }
  127. }