EffectOpenAndClose.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. const { ccclass, property, executeInEditMode, playOnFocus } = cc._decorator;
  2. /** 效果类型 */
  3. enum EffectType {
  4. none = 0, //无
  5. scale = 1, //缩放
  6. scaleToPoint = 2, //缩放到某点
  7. centerUnfolding = 3, //从中部展开
  8. rightIn = 4, //从右侧进入
  9. bottomIn = 5, //从底部进入
  10. }
  11. /**
  12. * 界面打开 和 关闭效果
  13. * 组件请挂载到对应ui界面上
  14. * @author 薛鸿潇
  15. */
  16. @ccclass
  17. @executeInEditMode()
  18. @playOnFocus()
  19. export default class EffectOpenAndClose extends cc.Component {
  20. @property({ type: cc.Node, displayName: '动画节点' })
  21. private effect_par: cc.Node = null
  22. @property({ type: cc.Enum(EffectType), displayName: '打开动画节点效果', visible() { return this.effect_par } })
  23. private open_effect: EffectType = EffectType.scale;
  24. @property({ type: cc.Enum(EffectType), displayName: '关闭动画节点效果', visible() { return this.effect_par } })
  25. private close_effect: EffectType = EffectType.scale;
  26. @property({ displayName: '关闭节点缩小到此节点坐标', visible() { return this.close_effect == EffectType.scaleToPoint } })
  27. private close_toPoint: string = "";
  28. private _play_open: boolean = false;
  29. @property({ displayName: "预览开" })
  30. get play_open(): boolean {
  31. if (this._play_open) {
  32. this.showEffect();
  33. this._play_open = false;
  34. }
  35. return this._play_open;
  36. }
  37. set play_open(v: boolean) {
  38. this._play_open = v;
  39. }
  40. private _play_close: boolean = false;
  41. @property({ displayName: "预览关" })
  42. get play_close(): boolean {
  43. if (this._play_close) {
  44. this.effect_par.scale = 1;
  45. this.hideEffect();
  46. this._play_close = false;
  47. }
  48. return this._play_close;
  49. }
  50. set play_close(v: boolean) {
  51. this._play_close = v;
  52. }
  53. onLoad() {
  54. // this.node.on('ui-close', this.hideEffect, this);// 界面关闭事件
  55. }
  56. start() {
  57. if (CC_EDITOR) return;
  58. this.showEffect();
  59. }
  60. /**
  61. * 界面打开效果
  62. */
  63. private showEffect() {
  64. if (this.effect_par) {
  65. switch (this.open_effect) {
  66. case EffectType.none:
  67. break;
  68. case EffectType.scale:
  69. mk.tween.scale(this.effect_par, 0.3, undefined, undefined, undefined, 'backOut');
  70. break;
  71. case EffectType.centerUnfolding:
  72. mk.tween.scaleX(this.effect_par, 0.3, undefined, undefined, undefined, 'backOut');
  73. break;
  74. case EffectType.rightIn:
  75. this.effect_par.active = true;
  76. this.effect_par.x = 1000;
  77. cc.tween(this.effect_par)
  78. .to(0.3, { x: 0 }, cc.easeOut(3))
  79. .start()
  80. break;
  81. case EffectType.bottomIn:
  82. this.effect_par.active = true;
  83. this.effect_par.y = -(1334 / 2);
  84. let toY = this.effect_par.y + this.effect_par.height;
  85. cc.tween(this.effect_par)
  86. .to(0.3, { y: toY }, cc.easeBackInOut())
  87. .start()
  88. break;
  89. }
  90. }
  91. }
  92. /**
  93. * 关闭打开效果
  94. * @param cb 结束回调
  95. */
  96. public hideEffect(cb?: Function) {
  97. if (this.effect_par) {
  98. switch (this.close_effect) {
  99. case EffectType.none:
  100. cb && cb();
  101. break;
  102. case EffectType.scale:
  103. mk.tween.scale(this.effect_par, 0.15, 1, 0, cb);
  104. break;
  105. case EffectType.scaleToPoint:
  106. if (this.close_toPoint == "") {
  107. console.error('需要配置缩小到终点节点路径')
  108. } else {
  109. let path = this.close_toPoint;
  110. let node = cc.find(path);
  111. if (node) {
  112. let world_pos = node.parent.convertToWorldSpaceAR(node.getPosition());
  113. let node_pos = this.effect_par.parent.convertToNodeSpaceAR(world_pos);
  114. mk.tween.scaleParallelMove(this.effect_par, 0.3, 1, 0, node_pos, cb)
  115. // cc.tween(this.effect_par)
  116. // .to(0.3, { scale: 0, position: new cc.Vec3(node_pos.x, node_pos.y, 0) })
  117. // .call(() => {
  118. // cb && cb();
  119. // })
  120. // .start()
  121. } else {
  122. cb && cb();
  123. cc.error('关闭时动画节点未找到,请检查!!!!!')
  124. }
  125. }
  126. break;
  127. case EffectType.rightIn:
  128. mk.tween.move(this.effect_par, 0.3, this.effect_par.getPosition(), new cc.Vec2(1000, this.effect_par.y), () => {
  129. this.effect_par.active = false;
  130. cb && cb();
  131. }, 'sineOut')
  132. // cc.tween(this.effect_par)
  133. // .to(0.3, { x: 1000 }, cc.easeOut(3))
  134. // .call(() => {
  135. // this.effect_par.active = false;
  136. // cb && cb();
  137. // })
  138. // .start()
  139. break;
  140. case EffectType.bottomIn:
  141. let toY = -(1334 / 2);
  142. cc.tween(this.effect_par)
  143. .to(0.3, { y: toY }, cc.easeOut(3))
  144. .call(() => {
  145. // this.effect_par.active = false;
  146. cb && cb();
  147. })
  148. .start()
  149. break;
  150. }
  151. } else {
  152. cb && cb();
  153. }
  154. }
  155. }