/*
 * @Descripttion: 
 * @version: 1.0.0
 * @Author: YeeChan
 * @Date: 2020-07-23 16:59:58
 */
/**
 * Timer工具
 */
export class TimerUtils {

    /**
     * 循环执行 有限次数
     * @param handler 回调
     * @param interval 间隔时间 秒
     * @param repeat 重复次数(实际运行repeat + 1次)
     * @param delay 延迟多少时间后开始执行 秒
     */
    public static loopNum_custom(handler: Function, interval: number, repeat: number, delay: number) {
        return this.schedule_custom(handler, interval, repeat, delay);
    }


    /**
     * 延迟执行一次。
     * @param handler 回调
     * @param delayTime 延迟时间 秒
     */
    public static once_custom(handler: Function, delayTime: number = 0) {
        return this.scheduleOnce_custom(handler, delayTime);
    }


    /**
     * 循环执行 一直循环
     * @param handler 回调
     * @param intervlTime 间隔时间 秒 值为 0,那么回调函数每一帧都会被调用
     * @param delay 延迟时间执行  秒
     */
    public static loop_custom(handler: Function, intervlTime: number = 0, delay: number = 0) {
        return this.schedule_custom(handler, intervlTime ? intervlTime : 0.02, cc.macro.REPEAT_FOREVER, delay);
    }


    /**
     * 移除计时器Timer
     * @param handler 回调
     */
    public static removeTimer_custom(handler: Function) {
        this.unschedule_custom(handler);
    }


    /**
     * 移除所有Timer
     */
    public static removeAllTimers_custom() {
        cc.director.getScheduler().unscheduleAllForTarget(this)
    }


    /**
     * 单次调度
     * @param handler 
     * @param delay 
     */
    private static scheduleOnce_custom(handler: Function, delay: number) {
        this.schedule_custom(handler, 0, 0, delay);
        return handler;
    }


    /**
     * Timer开始调度
     * @param handler 回调
     * @param interval 间隔时间
     * @param repeat 重复次数(实际运行repeat + 1次)
     * @param delay 延迟多少时间后开始执行
     */
    private static schedule_custom(handler: Function, interval: number, repeat: number, delay: number) {
        cc.director.getScheduler().schedule(handler, this, interval, repeat, delay);
        return handler;
    }


    /**
     * 移除调度
     * @param handler 
     */
    private static unschedule_custom(handler: Function) {
        if (!handler) return;
        cc.director.getScheduler().unschedule(handler, this);
    }

}