-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMainLoop.ts
64 lines (47 loc) · 1.21 KB
/
MainLoop.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { Event, EventDispatcher } from './events';
export class MainLoop extends EventDispatcher {
public '@start' = new Event<MainLoop, []>(this);
public '@stop' = new Event<MainLoop, []>(this);
public '@update' = new Event<MainLoop, [dt: number]>(this);
public isEnabled: boolean;
public prevTime: number;
public maxDiff: number;
public mindt: number;
public dt!: number;
constructor(p: {
maxDiff?: number,
mindt?: number,
fps?: number
} = {}) {
super();
this.isEnabled = false;
this.prevTime = 0;
this.maxDiff = p.maxDiff || 1000;
this.mindt = p.mindt || 1000 / (p.fps || 120);
}
public start(this: MainLoop): void {
if(this.isEnabled) return;
this.isEnabled = true;
let _update = (currentTime: number): void => {
if(!this.isEnabled) {
this.emit('stop');
return;
}
this.dt = currentTime - this.prevTime;
if(this.dt > this.mindt) {
if(this.dt < this.maxDiff) this['@update'].emit(this.dt);
this.prevTime = currentTime;
}
requestAnimationFrame(_update);
};
this.emit('start');
requestAnimationFrame(_update);
}
public stop(): void {
if(!this.isEnabled) return;
this.isEnabled = false;
}
public destroy(): void {
this.events_off(true);
}
}