import { Component, director, macro } from "cc"; export default class CountDownSchedule extends Component { private _lastUpdate = null; private _observers = null; public constructor() { super(); this._observers = []; this._lastUpdate = (new Date()).getTime(); }; /** * 启动一个计时器 * @param callback 每次回调 * @param interval 执行间隔 * @param key 计时器标识,用于移除使用 * @example *
* private const = 0
* Global.cdSchedule.schedule(() => {
* this.const++;
* console.log(this.const);
* if (this.const == 10) {
* Global.cdSchedule.unschedule("test");
* }
* }, 1, "test");
*
*/
public schedule(callback, interval, key) {
if (this._observers.length <= 0) {
this._lastUpdate = (new Date()).getTime();
director.getScheduler().schedule(this.onUpdateTime.bind(this), this, 0.05, macro.REPEAT_FOREVER, 0, false);
}
let obj = new CountDownObserver(callback, interval, key);
this._observers.push(obj);
}
public onUpdateTime(dt: number) {
let now = (new Date()).getTime();
let deltaTime = (now - this._lastUpdate) / 1000;
this._lastUpdate = now;
for (let i = 0; i < this._observers.length; i++) {
if (this._observers[i] && this._observers[i].update) {
this._observers[i].update(deltaTime);
}
}
return false;
}
/**
* 通过计时器标识查找计时器是否存在
* @param key 计时器标识
* @returns
*/
public isScheduled(key) {
for (let i = 0; i < this._observers.length; i++) {
if (this._observers[i]._key == key) {
return true;
}
}
return false;
}
/**
* 移除计时器
* @param key 计时器标识
*/
public unschedule(key) {
for (let i = 0; i < this._observers.length; i++) {
if (this._observers[i]._key == key) {
this._observers.splice(i, 1);
break;
}
}
}
/**
* 移除所以计时器
*/
public unscheduleAll() {
director.getScheduler().unscheduleAllForTarget(this);
this._observers = [];
}
public changeScheduleKey(oldKey, newKey) {
for (let i = 0; i < this._observers.length; i++) {
if (this._observers[i]._key == oldKey) {
this._observers[i]._key = newKey;
break;
}
}
}
};
class CountDownObserver {
private _interval = 0;
private _elapsed = 0;
private _callback = null;
private _key = null;
public constructor(callback, interval, key) {
this._callback = callback;
this._interval = interval;
this._key = key;
}
public update(dt) {
this._elapsed += dt;
if (this._elapsed > this._interval) {
if (this._callback) {
this._callback(this._elapsed);
}
this._elapsed = 0.0;
}
}
}