mani-game-engine 1.0.0-pre.62 → 1.0.0-pre.63

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.
package/lib/clock.d.ts CHANGED
@@ -13,6 +13,7 @@ export type Timeout = {
13
13
  };
14
14
  export type GameClockOptions = Partial<typeof defaultOptions>;
15
15
  export interface Clock {
16
+ readonly gameTime: number;
16
17
  onPrepare: Signal<unknown>;
17
18
  onEarlyUpdate: Signal<OnEarlyUpdateParams>;
18
19
  onUpdate: Signal<OnUpdateParams>;
@@ -26,13 +27,14 @@ export interface Clock {
26
27
  clearTimeout(timeoutId: number): boolean;
27
28
  }
28
29
  export declare class GameClock implements Clock {
30
+ get gameTime(): number;
29
31
  private nextTimeoutId;
30
32
  private timeouts;
31
33
  private isRunning;
32
34
  private requestId;
33
35
  private currentTime;
34
36
  private accumulator;
35
- private gameTime;
37
+ private _gameTime;
36
38
  private readonly _fixedDeltaTime;
37
39
  private update;
38
40
  private readonly maxFrameTime;
package/lib/clock.js CHANGED
@@ -10,6 +10,9 @@ const defaultOptions = {
10
10
  timeScale: 1,
11
11
  };
12
12
  class GameClock {
13
+ get gameTime() {
14
+ return this._gameTime;
15
+ }
13
16
  constructor(options) {
14
17
  this.nextTimeoutId = 0;
15
18
  this.timeouts = new Map();
@@ -17,7 +20,7 @@ class GameClock {
17
20
  this.requestId = 0;
18
21
  this.currentTime = 0;
19
22
  this.accumulator = 0;
20
- this.gameTime = 0;
23
+ this._gameTime = 0;
21
24
  this.update = (time) => {
22
25
  const newTime = time * 0.001;
23
26
  if (!this.isRunning) {
@@ -32,9 +35,9 @@ class GameClock {
32
35
  this.accumulator += frameTime;
33
36
  let isMultipleFixedUpdate = false;
34
37
  this.onPrepare.dispatch();
35
- this.onEarlyUpdate.dispatch({ time: this.gameTime, deltaTime: frameTime });
38
+ this.onEarlyUpdate.dispatch({ time: this._gameTime, deltaTime: frameTime });
36
39
  for (const [id, timeOut] of this.timeouts) {
37
- if (this.gameTime >= timeOut.callTime) {
40
+ if (this._gameTime >= timeOut.callTime) {
38
41
  timeOut.callback();
39
42
  if (timeOut.recall) {
40
43
  timeOut.callTime += timeOut.recall;
@@ -48,13 +51,13 @@ class GameClock {
48
51
  if (isMultipleFixedUpdate) {
49
52
  this.onPrepare.dispatch();
50
53
  }
51
- this.onFixedUpdate.dispatch({ time: this.gameTime, deltaTime: this._fixedDeltaTime });
54
+ this.onFixedUpdate.dispatch({ time: this._gameTime, deltaTime: this._fixedDeltaTime });
52
55
  isMultipleFixedUpdate = true;
53
56
  this.accumulator -= this._fixedDeltaTime;
54
- this.gameTime += this._fixedDeltaTime;
57
+ this._gameTime += this._fixedDeltaTime;
55
58
  }
56
59
  const alpha = this.accumulator / this._fixedDeltaTime;
57
- this.onUpdate.dispatch({ time: this.gameTime + alpha * this._fixedDeltaTime, deltaTime: frameTime, alpha: alpha });
60
+ this.onUpdate.dispatch({ time: this._gameTime + alpha * this._fixedDeltaTime, deltaTime: frameTime, alpha: alpha });
58
61
  if (this.isRunning) {
59
62
  this.requestId = requestAnimationFrame(this.update);
60
63
  }
@@ -99,13 +102,13 @@ class GameClock {
99
102
  return this;
100
103
  }
101
104
  setTimeout(callback, delay) {
102
- const timeOut = { callback, callTime: this.gameTime + delay };
105
+ const timeOut = { callback, callTime: this._gameTime + delay };
103
106
  this.nextTimeoutId++;
104
107
  this.timeouts.set(this.nextTimeoutId, timeOut);
105
108
  return this.nextTimeoutId;
106
109
  }
107
110
  setInterval(callback, delay) {
108
- const timeOut = { callback, callTime: this.gameTime + delay, recall: delay };
111
+ const timeOut = { callback, callTime: this._gameTime + delay, recall: delay };
109
112
  this.nextTimeoutId++;
110
113
  this.timeouts.set(this.nextTimeoutId, timeOut);
111
114
  return this.nextTimeoutId;
package/lib/clock.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mani-game-engine",
3
3
  "author": "Jan Mankopf",
4
- "version": "1.0.0-pre.62",
4
+ "version": "1.0.0-pre.63",
5
5
  "description": "entity component system game engine for typescript",
6
6
  "private": false,
7
7
  "scripts": {
package/src/clock.ts CHANGED
@@ -6,158 +6,162 @@ const MIN_TIME_SCALE = 0.00001;
6
6
  // type OnUpdateParams = { time: number, deltaTime: number, alpha: number; };
7
7
 
8
8
  const defaultOptions = {
9
- autoStart: true,
10
- fixedDeltaTime: 1 / 60,
11
- maxFrameTime: 0.25,
12
- timeScale: 1,
9
+ autoStart: true,
10
+ fixedDeltaTime: 1 / 60,
11
+ maxFrameTime: 0.25,
12
+ timeScale: 1,
13
13
  };
14
14
 
15
15
  export type Timeout = {
16
- recall?: number;
17
- callback: Function;
18
- callTime: number;
16
+ recall?: number;
17
+ callback: Function;
18
+ callTime: number;
19
19
  };
20
20
  export type GameClockOptions = Partial<typeof defaultOptions>;
21
21
 
22
22
  export interface Clock {
23
-
24
- onPrepare: Signal<unknown>;
25
- onEarlyUpdate: Signal<OnEarlyUpdateParams>;
26
- onUpdate: Signal<OnUpdateParams>;
27
- onFixedUpdate: Signal<OnFixedUpdateParams>;
28
- timeScale: number;
29
- start(): this;
30
- stop(): this;
31
- dispose(): void;
32
- setTimeout(callback: Function, delay: number): number;
33
- setInterval(callback: Function, delay: number): number;
34
- clearTimeout(timeoutId: number): boolean;
23
+ readonly gameTime: number;
24
+ onPrepare: Signal<unknown>;
25
+ onEarlyUpdate: Signal<OnEarlyUpdateParams>;
26
+ onUpdate: Signal<OnUpdateParams>;
27
+ onFixedUpdate: Signal<OnFixedUpdateParams>;
28
+ timeScale: number;
29
+ start(): this;
30
+ stop(): this;
31
+ dispose(): void;
32
+ setTimeout(callback: Function, delay: number): number;
33
+ setInterval(callback: Function, delay: number): number;
34
+ clearTimeout(timeoutId: number): boolean;
35
35
  }
36
36
 
37
37
  export class GameClock implements Clock {
38
- private nextTimeoutId = 0;
39
- private timeouts = new Map<number, Timeout>();
40
- private isRunning = false;
41
- private requestId = 0;
42
- private currentTime = 0;
43
- private accumulator = 0;
44
- private gameTime = 0;
45
-
46
- private readonly _fixedDeltaTime: number;
47
- private update = (time: number) => {
48
- const newTime = time * 0.001;
49
- if (!this.isRunning) {
50
- this.currentTime = newTime;
51
- this.isRunning = true;
52
- }
38
+ get gameTime(): number {
39
+ return this._gameTime;
40
+ }
41
+
42
+ private nextTimeoutId = 0;
43
+ private timeouts = new Map<number, Timeout>();
44
+ private isRunning = false;
45
+ private requestId = 0;
46
+ private currentTime = 0;
47
+ private accumulator = 0;
48
+ private _gameTime = 0;
49
+
50
+ private readonly _fixedDeltaTime: number;
51
+ private update = (time: number) => {
52
+ const newTime = time * 0.001;
53
+ if (!this.isRunning) {
54
+ this.currentTime = newTime;
55
+ this.isRunning = true;
56
+ }
53
57
 
54
- let frameTime = (newTime - this.currentTime) * this.timeScale;
58
+ let frameTime = (newTime - this.currentTime) * this.timeScale;
55
59
 
56
- if (frameTime > this.maxFrameTime) {
57
- frameTime = this.maxFrameTime;
58
- }
60
+ if (frameTime > this.maxFrameTime) {
61
+ frameTime = this.maxFrameTime;
62
+ }
59
63
 
60
- this.currentTime = newTime;
61
- this.accumulator += frameTime;
62
- let isMultipleFixedUpdate = false;
64
+ this.currentTime = newTime;
65
+ this.accumulator += frameTime;
66
+ let isMultipleFixedUpdate = false;
63
67
 
64
- this.onPrepare.dispatch();
65
- this.onEarlyUpdate.dispatch({time: this.gameTime, deltaTime: frameTime});
66
-
67
- for (const [id, timeOut] of this.timeouts) {
68
- if (this.gameTime >= timeOut.callTime) {
69
- timeOut.callback();
70
- if (timeOut.recall) {
71
- timeOut.callTime += timeOut.recall;
72
- } else {
73
- this.timeouts.delete(id);
74
- }
75
- }
76
- }
68
+ this.onPrepare.dispatch();
69
+ this.onEarlyUpdate.dispatch({time: this._gameTime, deltaTime: frameTime});
77
70
 
78
- while (this.accumulator >= this._fixedDeltaTime) {
79
- if (isMultipleFixedUpdate) {
80
- this.onPrepare.dispatch();
81
- }
82
- this.onFixedUpdate.dispatch({time: this.gameTime, deltaTime: this._fixedDeltaTime});
83
- isMultipleFixedUpdate = true;
84
- this.accumulator -= this._fixedDeltaTime;
85
- this.gameTime += this._fixedDeltaTime;
86
- }
87
- const alpha = this.accumulator / this._fixedDeltaTime;
88
- this.onUpdate.dispatch({time: this.gameTime + alpha * this._fixedDeltaTime, deltaTime: frameTime, alpha: alpha});
89
- if (this.isRunning) {
90
- this.requestId = requestAnimationFrame(this.update);
71
+ for (const [id, timeOut] of this.timeouts) {
72
+ if (this._gameTime >= timeOut.callTime) {
73
+ timeOut.callback();
74
+ if (timeOut.recall) {
75
+ timeOut.callTime += timeOut.recall;
76
+ } else {
77
+ this.timeouts.delete(id);
91
78
  }
92
- };
93
-
94
- private readonly maxFrameTime: number;
95
-
96
- readonly onPrepare = new Signal();
97
- readonly onEarlyUpdate = new Signal<OnEarlyUpdateParams>();
98
- readonly onUpdate = new Signal<OnUpdateParams>();
99
- readonly onFixedUpdate = new Signal<OnFixedUpdateParams>();
100
-
101
- constructor(options?: GameClockOptions) {
102
- const opts = {...defaultOptions, ...options} as Required<GameClockOptions>;
103
- this._fixedDeltaTime = opts.fixedDeltaTime;
104
- this.maxFrameTime = opts.maxFrameTime;
105
- this.timeScale = opts.timeScale;
106
-
107
- opts.autoStart && this.start();
79
+ }
108
80
  }
109
81
 
110
- dispose(): void {
111
- this.onPrepare.detachAll();
112
- this.onEarlyUpdate.detachAll();
113
- this.onUpdate.detachAll();
114
- this.onFixedUpdate.detachAll();
82
+ while (this.accumulator >= this._fixedDeltaTime) {
83
+ if (isMultipleFixedUpdate) {
84
+ this.onPrepare.dispatch();
85
+ }
86
+ this.onFixedUpdate.dispatch({time: this._gameTime, deltaTime: this._fixedDeltaTime});
87
+ isMultipleFixedUpdate = true;
88
+ this.accumulator -= this._fixedDeltaTime;
89
+ this._gameTime += this._fixedDeltaTime;
90
+ }
91
+ const alpha = this.accumulator / this._fixedDeltaTime;
92
+ this.onUpdate.dispatch({time: this._gameTime + alpha * this._fixedDeltaTime, deltaTime: frameTime, alpha: alpha});
93
+ if (this.isRunning) {
94
+ this.requestId = requestAnimationFrame(this.update);
115
95
  }
96
+ };
116
97
 
117
- get fixedDeltaTime(): number { return this._fixedDeltaTime; }
98
+ private readonly maxFrameTime: number;
118
99
 
119
- private _timeScale = 1;
100
+ readonly onPrepare = new Signal();
101
+ readonly onEarlyUpdate = new Signal<OnEarlyUpdateParams>();
102
+ readonly onUpdate = new Signal<OnUpdateParams>();
103
+ readonly onFixedUpdate = new Signal<OnFixedUpdateParams>();
120
104
 
121
- get timeScale(): number {
122
- return this._timeScale;
123
- }
105
+ constructor(options?: GameClockOptions) {
106
+ const opts = {...defaultOptions, ...options} as Required<GameClockOptions>;
107
+ this._fixedDeltaTime = opts.fixedDeltaTime;
108
+ this.maxFrameTime = opts.maxFrameTime;
109
+ this.timeScale = opts.timeScale;
124
110
 
125
- set timeScale(value: number) {
126
- this._timeScale = Math.max(value, MIN_TIME_SCALE);
127
- }
111
+ opts.autoStart && this.start();
112
+ }
128
113
 
129
- start(): this {
130
- if (this.isRunning) {
131
- return this;
132
- }
133
- this.requestId = requestAnimationFrame(this.update);
134
- return this;
135
- }
114
+ dispose(): void {
115
+ this.onPrepare.detachAll();
116
+ this.onEarlyUpdate.detachAll();
117
+ this.onUpdate.detachAll();
118
+ this.onFixedUpdate.detachAll();
119
+ }
136
120
 
137
- stop(): this {
138
- if (!this.isRunning) {
139
- return this;
140
- }
141
- this.isRunning = false;
142
- cancelAnimationFrame(this.requestId);
143
- return this;
144
- }
121
+ get fixedDeltaTime(): number { return this._fixedDeltaTime; }
145
122
 
146
- setTimeout(callback: Function, delay: number) {
147
- const timeOut: Timeout = {callback, callTime: this.gameTime + delay};
148
- this.nextTimeoutId++;
149
- this.timeouts.set(this.nextTimeoutId, timeOut);
150
- return this.nextTimeoutId;
151
- }
123
+ private _timeScale = 1;
124
+
125
+ get timeScale(): number {
126
+ return this._timeScale;
127
+ }
128
+
129
+ set timeScale(value: number) {
130
+ this._timeScale = Math.max(value, MIN_TIME_SCALE);
131
+ }
152
132
 
153
- setInterval(callback: Function, delay: number) {
154
- const timeOut: Timeout = {callback, callTime: this.gameTime + delay, recall: delay};
155
- this.nextTimeoutId++;
156
- this.timeouts.set(this.nextTimeoutId, timeOut);
157
- return this.nextTimeoutId;
133
+ start(): this {
134
+ if (this.isRunning) {
135
+ return this;
158
136
  }
137
+ this.requestId = requestAnimationFrame(this.update);
138
+ return this;
139
+ }
159
140
 
160
- clearTimeout(timeoutId: number) {
161
- return this.timeouts.delete(timeoutId);
141
+ stop(): this {
142
+ if (!this.isRunning) {
143
+ return this;
162
144
  }
145
+ this.isRunning = false;
146
+ cancelAnimationFrame(this.requestId);
147
+ return this;
148
+ }
149
+
150
+ setTimeout(callback: Function, delay: number) {
151
+ const timeOut: Timeout = {callback, callTime: this._gameTime + delay};
152
+ this.nextTimeoutId++;
153
+ this.timeouts.set(this.nextTimeoutId, timeOut);
154
+ return this.nextTimeoutId;
155
+ }
156
+
157
+ setInterval(callback: Function, delay: number) {
158
+ const timeOut: Timeout = {callback, callTime: this._gameTime + delay, recall: delay};
159
+ this.nextTimeoutId++;
160
+ this.timeouts.set(this.nextTimeoutId, timeOut);
161
+ return this.nextTimeoutId;
162
+ }
163
+
164
+ clearTimeout(timeoutId: number) {
165
+ return this.timeouts.delete(timeoutId);
166
+ }
163
167
  }