2022-08-26 16:48:17 +08:00

55 lines
1.7 KiB
TypeScript

const { ccclass } = cc._decorator;
@ccclass
export default class Shake extends cc.ActionInterval {
private _init: boolean = false;
private _initial_x: number = 0;
private _initial_y: number = 0;
private _strength_x: number = 0;
private _strength_y: number = 0;
/**
* 建立抖動動畫
* @param {number} duration 動畫持續時長
* @param {number} strength_x 抖動幅度: x方向
* @param {number} strength_y 抖動幅度: y方向
* @returns {Shake}
*/
public static create(duration: number, strength_x: number, strength_y: number): Shake {
let act: Shake = new Shake();
act.initWithDuration(duration, strength_x, strength_y);
return act;
}
public initWithDuration(duration: number, strength_x: number, strength_y: number): boolean {
cc.ActionInterval.prototype['initWithDuration'].apply(this, arguments);
this._strength_x = strength_x;
this._strength_y = strength_y;
return true;
}
public fgRangeRand(min: number, max: number): number {
let rnd: number = Math.random();
return rnd * (max - min) + min;
}
public update(time: number): void {
let randx = this.fgRangeRand(-this._strength_x, this._strength_x);
let randy = this.fgRangeRand(-this._strength_y, this._strength_y);
this.getTarget()?.setPosition(randx + this._initial_x, randy + this._initial_y);
}
public startWithTarget(target: cc.Node): void {
cc.ActionInterval.prototype['startWithTarget'].apply(this, arguments);
if (!this._init) {
this._init = true;
this._initial_x = target.x;
this._initial_y = target.y;
}
}
public stop(): void {
this.getTarget()?.setPosition(new cc.Vec2(this._initial_x, this._initial_y));
cc.ActionInterval.prototype['stop'].apply(this);
}
}