class ShakeTool1 {
    private static instance: ShakeTool1;   //单例
    public static getInstance(): ShakeTool1 {
        if (this.instance == null) {
            this.instance = new ShakeTool1();
        }
        return this.instance;
    }

    private checkForMinimumValues: boolean = true;
    private minShakeValue: number = 0.001;
    private minRotationValue: number = 0.001;

    /**屏幕震动 */
    public ShakeScreen() {
        Main.Instance.getSceneRoot().x = 0
        Main.Instance.getSceneRoot().y = 0
        ShakeTool1.getInstance().DoShake_Internal(Main.Instance.getSceneRoot(),
            2, //震动次数
            new egret.Point(0.5, 0.5), //x,y轴的震动系数[-1,1]
            new egret.Point(1, 1), //x,y轴的震动量级
            0,  //旋转量级
            8, //震动x.y轴的最大偏移量
            50, //如果速度越快,则振幅越剧烈
            1 //振幅的递减系数
        )
    }

	/**
	 * 屏幕震动
	 * @param camera 震动对象
	 * @param numberOfShakes 震动次数
	 * @param seed   x,y轴的震动系数[-1,1]
	 * @param shakeAmount  x,y轴的震动量级
	 * @param rotationAmount  旋转量级  如果小于0表示:不旋转
	 * @param distance   震动x.y轴的最大偏移量
	 * @param speed 如果速度越快,则振幅越剧烈
	 * @param decay 振幅的递减系数
	 * @param endCallBack 结束回调
	 *
	 */
    public DoShake_Internal(cam: egret.DisplayObject, numberOfShakes: number, seed: egret.Point, shakeAmount: egret.Point,
        rotationAmount: number, distance: number, speed: number,
        decay: number, endCallBack: Function = null) {

        if (cam == null)
            return

        var defaultPointY = cam.x
        var defaultPointX = cam.y
        var defaultRotation = cam.rotation

        // Set random values
        var mod1 = seed.x > 0.5 ? 1 : -1;
        var mod2 = seed.y > 0.5 ? 1 : -1;

        var currentShakes = numberOfShakes
        var shakeDistance = distance;
        let shakePosition: egret.Point
        let shakeRotation: egret.Point
        let guiShakePosition: egret.Point
        let rotationStrength = 1;
        let start1: egret.Point = new egret.Point(0, 0)
        let startR: egret.Point = new egret.Point(0, 0)

        let startTime = 0

        let timeOnEnterFrame = -1
        let curTime: number = 0

        let resetEvent = () => {
            cam.x = defaultPointY
            cam.y = defaultPointY
            cam.rotation = defaultRotation
            cam.removeEventListener(egret.Event.ENTER_FRAME, updateEvent, this)
            if (endCallBack != null) {
                endCallBack()
            }
        }


        let updateEvent = () => {
            var now = egret.getTimer();
            var time = timeOnEnterFrame;
            var pass = (now - time) / 1000;
            if (timeOnEnterFrame == -1) {
                timeOnEnterFrame = now;
                return
            }
            else {
                timeOnEnterFrame = now;
            }

            curTime += pass
            curTime = curTime * speed

            if (this.checkForMinimumValues) {
                if (rotationStrength <= this.minRotationValue) {
                    resetEvent()
                    return
                }

                if (distance != 0 && shakeDistance <= this.minShakeValue) {
                    resetEvent()
                    return;
                }

                if (currentShakes <= 0) {
                    resetEvent()
                    return;
                }
            }

            if (cam == null) {
                return
            }

            cam.x = defaultPointY + mod1 * Math.sin(curTime) * (shakeAmount.x * shakeDistance)
            cam.y = defaultPointX + mod2 * Math.cos(curTime) * (shakeAmount.y * shakeDistance)
            if (rotationAmount > 0) {
                cam.rotation = defaultRotation + Math.cos(curTime) * (rotationAmount * rotationStrength)
            }


            if (curTime > Math.PI * 2) {
                curTime = 0;
                shakeDistance *= (1 - Tools.Mathf.Clamp01(decay));
                rotationStrength *= (1 - Tools.Mathf.Clamp01(decay));
                currentShakes--;
            }
        }

        cam.addEventListener(egret.Event.ENTER_FRAME, updateEvent, this);

    }
}
01-11 19:31