|
|
@@ -0,0 +1,91 @@
|
|
|
+
|
|
|
+const { ccclass, property, executeInEditMode, playOnFocus } = cc._decorator;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author 薛鸿潇
|
|
|
+ */
|
|
|
+@ccclass
|
|
|
+@executeInEditMode()
|
|
|
+@playOnFocus()
|
|
|
+export default class ZPathFalling extends cc.Component {
|
|
|
+ @property({ displayName: '自动播放' }) private play_on_load: boolean = true;
|
|
|
+ @property({ displayName: '完成回调', type: cc.Component.EventHandler }) public onComplete: cc.Component.EventHandler = new cc.Component.EventHandler();
|
|
|
+ /** 编辑器预览 */
|
|
|
+ private _edit_play: boolean = false;
|
|
|
+ @property({ displayName: '编辑器预览' })
|
|
|
+ get edit_play(): boolean {
|
|
|
+ if (this._edit_play && !this.edit_playing) {
|
|
|
+ this.edit_playing = true;
|
|
|
+ this.play();
|
|
|
+ }
|
|
|
+ return this._edit_play;
|
|
|
+ }
|
|
|
+ set edit_play(v: boolean) {
|
|
|
+ this._edit_play = v;
|
|
|
+ if (!v) this.stop();
|
|
|
+ }
|
|
|
+ /** 编辑器是否正在播放 */
|
|
|
+ private edit_playing = false;
|
|
|
+ onLoad() {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ start() {
|
|
|
+ if (CC_EDITOR) {
|
|
|
+ this.edit_play && this.play();
|
|
|
+ } else {
|
|
|
+ this.play_on_load && this.play();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /** z字落地术 */
|
|
|
+ private play() {
|
|
|
+ // z字三点式
|
|
|
+ let end_pos1 = this.node.getPosition();
|
|
|
+ let end_pos2 = this.node.getPosition();
|
|
|
+ let end_pos3 = this.node.getPosition();
|
|
|
+ // 左右坐标
|
|
|
+ if (this.node.x >= 0) {
|
|
|
+ // 在右边,左飘
|
|
|
+ end_pos1.x -= this.node.width * 3;
|
|
|
+ end_pos2.x -= this.node.width * 1;
|
|
|
+ end_pos3.x -= this.node.width * 2;
|
|
|
+ } else {
|
|
|
+ // 在左边,右飘
|
|
|
+ end_pos1.x += this.node.width * 3;
|
|
|
+ end_pos2.x += this.node.width * 1;
|
|
|
+ end_pos3.x += this.node.width * 2;
|
|
|
+ }
|
|
|
+ // 下落
|
|
|
+ end_pos1.y -= this.node.height / 2;
|
|
|
+ end_pos2.y -= this.node.height;
|
|
|
+ end_pos3.y -= this.node.height * 1.2;
|
|
|
+ // // 上下坐标
|
|
|
+ // if (this.node.y <= -200) {
|
|
|
+ // // 在下面
|
|
|
+ // end_pos1.y += this.node.height / 1;
|
|
|
+ // end_pos2.y += this.node.height * 1.5;
|
|
|
+ // end_pos3.y += this.node.height * 2;
|
|
|
+ // } else {
|
|
|
+ // // 在上面
|
|
|
+ // end_pos1.y -= this.node.height / 2;
|
|
|
+ // end_pos2.y -= this.node.height;
|
|
|
+ // end_pos3.y -= this.node.height * 1.2;
|
|
|
+ // }
|
|
|
+ let pos1 = cc.tween().to(0.5, { position: end_pos1 }, { easing: 'cubicOut' })
|
|
|
+ let pos2 = cc.tween().to(0.5, { position: end_pos2 }, { easing: 'cubicOut' })
|
|
|
+ let pos3 = cc.tween().to(0.5, { position: end_pos3 }, { easing: 'cubicOut' })
|
|
|
+ let call1 = cc.tween().call(() => {
|
|
|
+ this.edit_playing = false;
|
|
|
+ this.edit_play = false;
|
|
|
+ this.onComplete.handler && this.onComplete.emit([this.node]);
|
|
|
+ })
|
|
|
+ cc.tween(this.node).then(pos1).then(pos2).then(pos3).then(call1).start();
|
|
|
+ }
|
|
|
+ /** 停止动画 */
|
|
|
+ private stop() {
|
|
|
+ this.edit_playing = false;
|
|
|
+ this.node.stopAllActions();
|
|
|
+ }
|
|
|
+ // update (dt) {}
|
|
|
+}
|