mani-game-engine 1.0.0-pre.12 → 1.0.0-pre.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
- import { System } from './types';
2
- import { Signal, SignalCallback } from './index';
3
- export declare class SystemContext<T extends System = System> {
4
- readonly entity: Object;
5
- readonly system: T;
6
- private signalBindings;
7
- constructor(entity: Object);
8
- addSignalById<S>(signalId: string | symbol, callback: SignalCallback<S>, thisArg?: unknown): void;
9
- addSignal<S>(signal: Signal<S>, callback: SignalCallback<S>, thisArg?: unknown): void;
10
- addSignalOnce<S>(signal: Signal<S>, callback: SignalCallback<S>, thisArg?: unknown): void;
11
- dispose(): void;
12
- }
1
+ import { System } from './types';
2
+ import { Signal, SignalCallback } from './index';
3
+ export declare class SystemContext<T extends System = System> {
4
+ readonly entity: Object;
5
+ readonly system: T;
6
+ private signalBindings;
7
+ constructor(entity: Object);
8
+ addSignalById<S>(signalId: string | symbol, callback: SignalCallback<S>, thisArg?: unknown): void;
9
+ addSignal<S>(signal: Signal<S>, callback: SignalCallback<S>, thisArg?: unknown): void;
10
+ addSignalOnce<S>(signal: Signal<S>, callback: SignalCallback<S>, thisArg?: unknown): void;
11
+ dispose(): void;
12
+ }
@@ -1,20 +1,20 @@
1
- export class SystemContext {
2
- constructor(entity) {
3
- this.entity = entity;
4
- this.signalBindings = [];
5
- }
6
- addSignalById(signalId, callback, thisArg) {
7
- this.signalBindings.push(this.entity.gameEngine.getSignal(signalId).add(callback, thisArg));
8
- }
9
- addSignal(signal, callback, thisArg) {
10
- this.signalBindings.push(signal.add(callback, thisArg));
11
- }
12
- addSignalOnce(signal, callback, thisArg) {
13
- this.signalBindings.push(signal.addOnce(callback, thisArg));
14
- }
15
- dispose() {
16
- for (const binding of this.signalBindings)
17
- binding.detach();
18
- }
19
- }
1
+ export class SystemContext {
2
+ constructor(entity) {
3
+ this.entity = entity;
4
+ this.signalBindings = [];
5
+ }
6
+ addSignalById(signalId, callback, thisArg) {
7
+ this.signalBindings.push(this.entity.gameEngine.getSignal(signalId).add(callback, thisArg));
8
+ }
9
+ addSignal(signal, callback, thisArg) {
10
+ this.signalBindings.push(signal.add(callback, thisArg));
11
+ }
12
+ addSignalOnce(signal, callback, thisArg) {
13
+ this.signalBindings.push(signal.addOnce(callback, thisArg));
14
+ }
15
+ dispose() {
16
+ for (const binding of this.signalBindings)
17
+ binding.detach();
18
+ }
19
+ }
20
20
  //# sourceMappingURL=systemContext.js.map
package/lib/types.d.ts CHANGED
@@ -1,69 +1,69 @@
1
- import { GameEngine } from './gameEngine';
2
- export interface System {
3
- [propName: string]: any;
4
- onPrepare?(): Promise<void>;
5
- onStart?(): void;
6
- onEnd?(): void;
7
- onPreFixedUpdate?(time: number, deltaTime: number): void;
8
- onEarlyUpdate?(time: number, deltaTime: number): void;
9
- onFixedUpdate?(time: number, deltaTime: number): void;
10
- onPhysicsUpdate?(time: number, deltaTime: number): void;
11
- onUpdate?(time: number, deltaTime: number, alpha: number): void;
12
- onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
13
- onPostPhysicsUpdate?(time: number, deltaTime: number): void;
14
- onLateFixedUpdate?(time: number, deltaTime: number): void;
15
- onRender?(time: number, deltaTime: number, alpha: number): void;
16
- }
17
- export interface Service {
18
- [propName: string]: any;
19
- onPrepare?(): Promise<void>;
20
- onStart?(): void;
21
- onEnd?(): void;
22
- onPreFixedUpdate?(time: number, deltaTime: number): void;
23
- onPostPhysicsUpdate?(time: number, deltaTime: number): void;
24
- onLateFixedUpdate?(time: number, deltaTime: number): void;
25
- onFixedUpdate?(time: number, deltaTime: number): void;
26
- onPhysicsUpdate?(time: number, deltaTime: number): void;
27
- onUpdate?(time: number, deltaTime: number, alpha: number): void;
28
- onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
29
- onRender?(): void;
30
- }
31
- declare type GameEngineCallback = (gameEngine: GameEngine) => void;
32
- export interface GameEnginePlugin {
33
- onPrepare?: GameEngineCallback;
34
- onStart?: GameEngineCallback;
35
- }
36
- export interface CommandClass {
37
- name?: string;
38
- new (...args: any[]): any;
39
- }
40
- export declare type OnUpdateParams = {
41
- time: number;
42
- deltaTime: number;
43
- alpha: number;
44
- };
45
- export declare type OnFixedUpdateParams = {
46
- time: number;
47
- deltaTime: number;
48
- };
49
- export declare type OnEarlyUpdateParams = {
50
- time: number;
51
- deltaTime: number;
52
- };
53
- export declare type AsyncAction<T = unknown> = (gameEngine: GameEngine) => Promise<T>;
54
- export declare type Action<T = any> = (gameEngine: GameEngine) => T;
55
- export declare type Class<T = any> = {
56
- new (...args: any[]): T;
57
- };
58
- export declare const EngineSignals: {
59
- OnStart: symbol;
60
- OnUpdate: symbol;
61
- OnLateUpdate: symbol;
62
- OnFixedUpdate: symbol;
63
- OnPrePhysics: symbol;
64
- OnPostPhysics: symbol;
65
- onLateFixedUpdate: symbol;
66
- OnRender: symbol;
67
- OnPrepare: symbol;
68
- };
69
- export {};
1
+ import { GameEngine } from './gameEngine';
2
+ export interface System {
3
+ [propName: string]: any;
4
+ onPrepare?(): Promise<void>;
5
+ onStart?(): void;
6
+ onEnd?(): void;
7
+ onPreFixedUpdate?(time: number, deltaTime: number): void;
8
+ onEarlyUpdate?(time: number, deltaTime: number): void;
9
+ onFixedUpdate?(time: number, deltaTime: number): void;
10
+ onPhysicsUpdate?(time: number, deltaTime: number): void;
11
+ onUpdate?(time: number, deltaTime: number, alpha: number): void;
12
+ onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
13
+ onPostPhysicsUpdate?(time: number, deltaTime: number): void;
14
+ onLateFixedUpdate?(time: number, deltaTime: number): void;
15
+ onRender?(time: number, deltaTime: number, alpha: number): void;
16
+ }
17
+ export interface Service {
18
+ [propName: string]: any;
19
+ onPrepare?(): Promise<void>;
20
+ onStart?(): void;
21
+ onEnd?(): void;
22
+ onPreFixedUpdate?(time: number, deltaTime: number): void;
23
+ onPostPhysicsUpdate?(time: number, deltaTime: number): void;
24
+ onLateFixedUpdate?(time: number, deltaTime: number): void;
25
+ onFixedUpdate?(time: number, deltaTime: number): void;
26
+ onPhysicsUpdate?(time: number, deltaTime: number): void;
27
+ onUpdate?(time: number, deltaTime: number, alpha: number): void;
28
+ onLateUpdate?(time: number, deltaTime: number, alpha: number): void;
29
+ onRender?(time: number, deltaTime: number, alpha: number): void;
30
+ }
31
+ declare type GameEngineCallback = (gameEngine: GameEngine) => void;
32
+ export interface GameEnginePlugin {
33
+ onPrepare?: GameEngineCallback;
34
+ onStart?: GameEngineCallback;
35
+ }
36
+ export interface CommandClass {
37
+ name?: string;
38
+ new (...args: any[]): any;
39
+ }
40
+ export declare type OnUpdateParams = {
41
+ time: number;
42
+ deltaTime: number;
43
+ alpha: number;
44
+ };
45
+ export declare type OnFixedUpdateParams = {
46
+ time: number;
47
+ deltaTime: number;
48
+ };
49
+ export declare type OnEarlyUpdateParams = {
50
+ time: number;
51
+ deltaTime: number;
52
+ };
53
+ export declare type AsyncAction<T = unknown> = (gameEngine: GameEngine) => Promise<T>;
54
+ export declare type Action<T = any> = (gameEngine: GameEngine) => T;
55
+ export declare type Class<T = any> = {
56
+ new (...args: any[]): T;
57
+ };
58
+ export declare const EngineSignals: {
59
+ OnStart: symbol;
60
+ OnUpdate: symbol;
61
+ OnLateUpdate: symbol;
62
+ OnFixedUpdate: symbol;
63
+ OnPrePhysics: symbol;
64
+ OnPostPhysics: symbol;
65
+ onLateFixedUpdate: symbol;
66
+ OnRender: symbol;
67
+ OnPrepare: symbol;
68
+ };
69
+ export {};
package/lib/types.js CHANGED
@@ -1,12 +1,12 @@
1
- export const EngineSignals = {
2
- OnStart: Symbol('OnStart'),
3
- OnUpdate: Symbol('OnUpdate'),
4
- OnLateUpdate: Symbol('OnLateUpdate'),
5
- OnFixedUpdate: Symbol('OnFixedUpdate'),
6
- OnPrePhysics: Symbol('OnPostPhysics'),
7
- OnPostPhysics: Symbol('OnPostPhysics'),
8
- onLateFixedUpdate: Symbol('OnPrepare'),
9
- OnRender: Symbol('OnRender'),
10
- OnPrepare: Symbol('OnPrepare'),
11
- };
1
+ export const EngineSignals = {
2
+ OnStart: Symbol('OnStart'),
3
+ OnUpdate: Symbol('OnUpdate'),
4
+ OnLateUpdate: Symbol('OnLateUpdate'),
5
+ OnFixedUpdate: Symbol('OnFixedUpdate'),
6
+ OnPrePhysics: Symbol('OnPostPhysics'),
7
+ OnPostPhysics: Symbol('OnPostPhysics'),
8
+ onLateFixedUpdate: Symbol('OnPrepare'),
9
+ OnRender: Symbol('OnRender'),
10
+ OnPrepare: Symbol('OnPrepare'),
11
+ };
12
12
  //# sourceMappingURL=types.js.map
@@ -1,6 +1,6 @@
1
- export declare class Map2k<K, V> {
2
- map: Map<K, Map<K, V>>;
3
- set(key1: K, key2: K, value: V): void;
4
- get(key1: K, key2: K): V | undefined;
5
- delete(key1: K, key2: K): void;
6
- }
1
+ export declare class Map2k<K, V> {
2
+ map: Map<K, Map<K, V>>;
3
+ set(key1: K, key2: K, value: V): void;
4
+ get(key1: K, key2: K): V | undefined;
5
+ delete(key1: K, key2: K): void;
6
+ }
@@ -1,40 +1,40 @@
1
- export class Map2k {
2
- constructor() {
3
- this.map = new Map();
4
- }
5
- set(key1, key2, value) {
6
- let first = this.map.get(key1);
7
- if (!first) {
8
- first = new Map();
9
- this.map.set(key1, first);
10
- }
11
- let second = this.map.get(key2);
12
- if (!second) {
13
- second = new Map();
14
- this.map.set(key2, second);
15
- }
16
- first.set(key2, value);
17
- second.set(key1, value);
18
- }
19
- get(key1, key2) {
20
- const first = this.map.get(key1);
21
- return first && first.get(key2);
22
- }
23
- delete(key1, key2) {
24
- let first = this.map.get(key1);
25
- if (first) {
26
- first.delete(key2);
27
- if (first.size === 0) {
28
- this.map.delete(key1);
29
- }
30
- }
31
- let second = this.map.get(key2);
32
- if (second) {
33
- second.delete(key1);
34
- if (second.size === 0) {
35
- this.map.delete(key2);
36
- }
37
- }
38
- }
39
- }
1
+ export class Map2k {
2
+ constructor() {
3
+ this.map = new Map();
4
+ }
5
+ set(key1, key2, value) {
6
+ let first = this.map.get(key1);
7
+ if (!first) {
8
+ first = new Map();
9
+ this.map.set(key1, first);
10
+ }
11
+ let second = this.map.get(key2);
12
+ if (!second) {
13
+ second = new Map();
14
+ this.map.set(key2, second);
15
+ }
16
+ first.set(key2, value);
17
+ second.set(key1, value);
18
+ }
19
+ get(key1, key2) {
20
+ const first = this.map.get(key1);
21
+ return first && first.get(key2);
22
+ }
23
+ delete(key1, key2) {
24
+ let first = this.map.get(key1);
25
+ if (first) {
26
+ first.delete(key2);
27
+ if (first.size === 0) {
28
+ this.map.delete(key1);
29
+ }
30
+ }
31
+ let second = this.map.get(key2);
32
+ if (second) {
33
+ second.delete(key1);
34
+ if (second.size === 0) {
35
+ this.map.delete(key2);
36
+ }
37
+ }
38
+ }
39
+ }
40
40
  //# sourceMappingURL=map2k.js.map
package/package.json CHANGED
@@ -1,41 +1,41 @@
1
- {
2
- "name": "mani-game-engine",
3
- "author": "Jan Mankopf",
4
- "version": "1.0.0-pre.12",
5
- "description": "entity component system game engine for typescript",
6
- "private": false,
7
- "scripts": {
8
- "build": "rimraf lib && tsc",
9
- "watch": "tsc -w",
10
- "test": "jest",
11
- "test watch": "jest --watch",
12
- "do-pre-publish": "npm publish --dry-run",
13
- "version-up": "npm version prerelease",
14
- "do-publish": "npm publish"
15
- },
16
- "main": "lib/index.js",
17
- "files": [
18
- "lib/*",
19
- "src/*"
20
- ],
21
- "typings": "lib/index.d.ts",
22
- "license": "MIT",
23
- "devDependencies": {
24
- "@fluffy-spoon/substitute": "^1.201.0",
25
- "@types/jest": "^26.0.22",
26
- "jest": "^26.6.3",
27
- "reflect-metadata": "^0.1.13",
28
- "rimraf": "^3.0.2",
29
- "ts-jest": "^26.5.4",
30
- "ts-node": "^9.1.1",
31
- "tslib": "^2.2.0",
32
- "typescript": "^4.2.4"
33
- },
34
- "peerDependencies": {
35
- "reflect-metadata": "^0.1.13"
36
- },
37
- "dependencies": {
38
- "mani-injector": "0.0.3",
39
- "mani-signal": "^1.0.6"
40
- }
41
- }
1
+ {
2
+ "name": "mani-game-engine",
3
+ "author": "Jan Mankopf",
4
+ "version": "1.0.0-pre.15",
5
+ "description": "entity component system game engine for typescript",
6
+ "private": false,
7
+ "scripts": {
8
+ "build": "rimraf lib && tsc",
9
+ "watch": "tsc -w",
10
+ "test": "jest",
11
+ "test watch": "jest --watch",
12
+ "do-pre-publish": "npm publish --dry-run",
13
+ "version-up": "npm version prerelease",
14
+ "do-publish": "npm publish"
15
+ },
16
+ "main": "lib/index.js",
17
+ "files": [
18
+ "lib/*",
19
+ "src/*"
20
+ ],
21
+ "typings": "lib/index.d.ts",
22
+ "license": "MIT",
23
+ "devDependencies": {
24
+ "@fluffy-spoon/substitute": "^1.201.0",
25
+ "@types/jest": "^26.0.22",
26
+ "jest": "^26.6.3",
27
+ "reflect-metadata": "^0.1.13",
28
+ "rimraf": "^3.0.2",
29
+ "ts-jest": "^26.5.4",
30
+ "ts-node": "^9.1.1",
31
+ "tslib": "^2.2.0",
32
+ "typescript": "^4.2.4"
33
+ },
34
+ "peerDependencies": {
35
+ "reflect-metadata": "^0.1.13"
36
+ },
37
+ "dependencies": {
38
+ "mani-injector": "0.0.3",
39
+ "mani-signal": "^1.0.6"
40
+ }
41
+ }
package/src/clock.ts CHANGED
@@ -1,115 +1,115 @@
1
- import {Signal} from 'mani-signal';
2
- import {OnEarlyUpdateParams, OnFixedUpdateParams, OnUpdateParams} from './types';
3
-
4
- const MIN_TIME_SCALE = 0.00001;
5
-
6
- // type OnUpdateParams = { time: number, deltaTime: number, alpha: number; };
7
-
8
- const defaultOptions = {
9
- autoStart: true,
10
- fixedDeltaTime: 1 / 60,
11
- maxFrameTime: 0.25,
12
- timeScale: 1,
13
- };
14
-
15
- export type GameClockOptions = Partial<typeof defaultOptions>;
16
-
17
- export interface Clock {
18
-
19
- onPrepare: Signal<unknown>;
20
- onEarlyUpdate: Signal<OnEarlyUpdateParams>;
21
- onUpdate: Signal<OnUpdateParams>;
22
- onFixedUpdate: Signal<OnFixedUpdateParams>;
23
- timeScale: number;
24
- start(): this;
25
- stop(): this;
26
- }
27
-
28
- export class GameClock implements Clock {
29
- private isRunning = false;
30
- private requestId = 0;
31
- private currentTime = 0;
32
- private accumulator = 0;
33
- private gameTime = 0;
34
-
35
- private readonly _fixedDeltaTime: number;
36
- private update = (time: number) => {
37
- const newTime = time * 0.001;
38
- if (!this.isRunning) {
39
- this.currentTime = newTime;
40
- this.isRunning = true;
41
- }
42
-
43
- let frameTime = (newTime - this.currentTime) * this.timeScale;
44
-
45
- if (frameTime > this.maxFrameTime) {
46
- frameTime = this.maxFrameTime;
47
- }
48
-
49
- this.currentTime = newTime;
50
- this.accumulator += frameTime;
51
- let isMultipleFixedUpdate = false;
52
-
53
- this.onPrepare.dispatch();
54
- this.onEarlyUpdate.dispatch({time: this.gameTime, deltaTime: frameTime});
55
- while (this.accumulator >= this._fixedDeltaTime) {
56
- if (isMultipleFixedUpdate) {
57
- this.onPrepare.dispatch();
58
- }
59
- this.onFixedUpdate.dispatch({time: this.gameTime, deltaTime: this._fixedDeltaTime});
60
- isMultipleFixedUpdate = true;
61
- this.accumulator -= this._fixedDeltaTime;
62
- this.gameTime += this._fixedDeltaTime;
63
- }
64
- const alpha = this.accumulator / this._fixedDeltaTime;
65
- this.onUpdate.dispatch({time: this.gameTime + alpha * this._fixedDeltaTime, deltaTime: frameTime, alpha: alpha});
66
- if (this.isRunning) {
67
- this.requestId = requestAnimationFrame(this.update);
68
- }
69
- };
70
-
71
- private maxFrameTime: number;
72
-
73
- readonly onPrepare = new Signal();
74
- readonly onEarlyUpdate = new Signal<OnEarlyUpdateParams>();
75
- readonly onUpdate = new Signal<OnUpdateParams>();
76
- readonly onFixedUpdate = new Signal<OnFixedUpdateParams>();
77
-
78
- constructor(options?: GameClockOptions) {
79
- const opts = {...defaultOptions, ...options} as Required<GameClockOptions>;
80
- this._fixedDeltaTime = opts.fixedDeltaTime;
81
- this.maxFrameTime = opts.maxFrameTime;
82
- this.timeScale = opts.timeScale;
83
-
84
- opts.autoStart && this.start();
85
- }
86
-
87
- get fixedDeltaTime(): number { return this._fixedDeltaTime; }
88
-
89
- private _timeScale = 1;
90
-
91
- get timeScale(): number {
92
- return this._timeScale;
93
- }
94
-
95
- set timeScale(value: number) {
96
- this._timeScale = Math.max(value, MIN_TIME_SCALE);
97
- }
98
-
99
- start(): this {
100
- if (this.isRunning) {
101
- return this;
102
- }
103
- this.requestId = requestAnimationFrame(this.update);
104
- return this;
105
- }
106
-
107
- stop(): this {
108
- if (!this.isRunning) {
109
- return this;
110
- }
111
- this.isRunning = false;
112
- cancelAnimationFrame(this.requestId);
113
- return this;
114
- }
115
- }
1
+ import {Signal} from 'mani-signal';
2
+ import {OnEarlyUpdateParams, OnFixedUpdateParams, OnUpdateParams} from './types';
3
+
4
+ const MIN_TIME_SCALE = 0.00001;
5
+
6
+ // type OnUpdateParams = { time: number, deltaTime: number, alpha: number; };
7
+
8
+ const defaultOptions = {
9
+ autoStart: true,
10
+ fixedDeltaTime: 1 / 60,
11
+ maxFrameTime: 0.25,
12
+ timeScale: 1,
13
+ };
14
+
15
+ export type GameClockOptions = Partial<typeof defaultOptions>;
16
+
17
+ export interface Clock {
18
+
19
+ onPrepare: Signal<unknown>;
20
+ onEarlyUpdate: Signal<OnEarlyUpdateParams>;
21
+ onUpdate: Signal<OnUpdateParams>;
22
+ onFixedUpdate: Signal<OnFixedUpdateParams>;
23
+ timeScale: number;
24
+ start(): this;
25
+ stop(): this;
26
+ }
27
+
28
+ export class GameClock implements Clock {
29
+ private isRunning = false;
30
+ private requestId = 0;
31
+ private currentTime = 0;
32
+ private accumulator = 0;
33
+ private gameTime = 0;
34
+
35
+ private readonly _fixedDeltaTime: number;
36
+ private update = (time: number) => {
37
+ const newTime = time * 0.001;
38
+ if (!this.isRunning) {
39
+ this.currentTime = newTime;
40
+ this.isRunning = true;
41
+ }
42
+
43
+ let frameTime = (newTime - this.currentTime) * this.timeScale;
44
+
45
+ if (frameTime > this.maxFrameTime) {
46
+ frameTime = this.maxFrameTime;
47
+ }
48
+
49
+ this.currentTime = newTime;
50
+ this.accumulator += frameTime;
51
+ let isMultipleFixedUpdate = false;
52
+
53
+ this.onPrepare.dispatch();
54
+ this.onEarlyUpdate.dispatch({time: this.gameTime, deltaTime: frameTime});
55
+ while (this.accumulator >= this._fixedDeltaTime) {
56
+ if (isMultipleFixedUpdate) {
57
+ this.onPrepare.dispatch();
58
+ }
59
+ this.onFixedUpdate.dispatch({time: this.gameTime, deltaTime: this._fixedDeltaTime});
60
+ isMultipleFixedUpdate = true;
61
+ this.accumulator -= this._fixedDeltaTime;
62
+ this.gameTime += this._fixedDeltaTime;
63
+ }
64
+ const alpha = this.accumulator / this._fixedDeltaTime;
65
+ this.onUpdate.dispatch({time: this.gameTime + alpha * this._fixedDeltaTime, deltaTime: frameTime, alpha: alpha});
66
+ if (this.isRunning) {
67
+ this.requestId = requestAnimationFrame(this.update);
68
+ }
69
+ };
70
+
71
+ private readonly maxFrameTime: number;
72
+
73
+ readonly onPrepare = new Signal();
74
+ readonly onEarlyUpdate = new Signal<OnEarlyUpdateParams>();
75
+ readonly onUpdate = new Signal<OnUpdateParams>();
76
+ readonly onFixedUpdate = new Signal<OnFixedUpdateParams>();
77
+
78
+ constructor(options?: GameClockOptions) {
79
+ const opts = {...defaultOptions, ...options} as Required<GameClockOptions>;
80
+ this._fixedDeltaTime = opts.fixedDeltaTime;
81
+ this.maxFrameTime = opts.maxFrameTime;
82
+ this.timeScale = opts.timeScale;
83
+
84
+ opts.autoStart && this.start();
85
+ }
86
+
87
+ get fixedDeltaTime(): number { return this._fixedDeltaTime; }
88
+
89
+ private _timeScale = 1;
90
+
91
+ get timeScale(): number {
92
+ return this._timeScale;
93
+ }
94
+
95
+ set timeScale(value: number) {
96
+ this._timeScale = Math.max(value, MIN_TIME_SCALE);
97
+ }
98
+
99
+ start(): this {
100
+ if (this.isRunning) {
101
+ return this;
102
+ }
103
+ this.requestId = requestAnimationFrame(this.update);
104
+ return this;
105
+ }
106
+
107
+ stop(): this {
108
+ if (!this.isRunning) {
109
+ return this;
110
+ }
111
+ this.isRunning = false;
112
+ cancelAnimationFrame(this.requestId);
113
+ return this;
114
+ }
115
+ }