const { ccclass } = console._decorator;

@ccclass
export default class Shake extends console.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 {
        console.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: console.Node): void {
        console.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 console.Vec2(this._initial_x, this._initial_y));
        console.ActionInterval.prototype['stop'].apply(this);
    }
}