like2d 2.9.0 → 2.10.0

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.
Files changed (103) hide show
  1. package/README.md +21 -17
  2. package/dist/__benchmarks__/vector2.bench.d.ts +2 -0
  3. package/dist/__benchmarks__/vector2.bench.d.ts.map +1 -0
  4. package/dist/__benchmarks__/vector2.bench.js +74 -0
  5. package/dist/{core → audio}/audio.d.ts +12 -3
  6. package/dist/audio/audio.d.ts.map +1 -0
  7. package/dist/{core → audio}/audio.js +10 -2
  8. package/dist/audio/index.d.ts +2 -0
  9. package/dist/audio/index.d.ts.map +1 -0
  10. package/dist/audio/index.js +1 -0
  11. package/dist/engine.d.ts +12 -42
  12. package/dist/engine.d.ts.map +1 -1
  13. package/dist/engine.js +34 -76
  14. package/dist/{core/events.d.ts → events.d.ts} +27 -50
  15. package/dist/events.d.ts.map +1 -0
  16. package/dist/events.js +5 -0
  17. package/dist/gamecontrollerdb.txt +2222 -0
  18. package/dist/{core → graphics}/canvas.d.ts +18 -11
  19. package/dist/graphics/canvas.d.ts.map +1 -0
  20. package/dist/{core → graphics}/canvas.js +73 -58
  21. package/dist/{core/graphics.d.ts → graphics/drawing.d.ts} +25 -25
  22. package/dist/graphics/drawing.d.ts.map +1 -0
  23. package/dist/{core/graphics.js → graphics/drawing.js} +59 -52
  24. package/dist/graphics/index.d.ts +19 -0
  25. package/dist/graphics/index.d.ts.map +1 -0
  26. package/dist/graphics/index.js +13 -0
  27. package/dist/index.d.ts +3 -30
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +0 -21
  30. package/dist/input/gamepad-mapping.d.ts +134 -0
  31. package/dist/input/gamepad-mapping.d.ts.map +1 -0
  32. package/dist/input/gamepad-mapping.js +146 -0
  33. package/dist/input/gamepad.d.ts +74 -0
  34. package/dist/input/gamepad.d.ts.map +1 -0
  35. package/dist/input/gamepad.js +288 -0
  36. package/dist/input/index.d.ts +6 -0
  37. package/dist/input/index.d.ts.map +1 -0
  38. package/dist/input/index.js +1 -0
  39. package/dist/input/input.d.ts +76 -0
  40. package/dist/input/input.d.ts.map +1 -0
  41. package/dist/input/input.js +164 -0
  42. package/dist/input/keyboard.d.ts +15 -0
  43. package/dist/input/keyboard.d.ts.map +1 -0
  44. package/dist/{core → input}/keyboard.js +11 -21
  45. package/dist/input/mouse.d.ts +108 -0
  46. package/dist/input/mouse.d.ts.map +1 -0
  47. package/dist/input/mouse.js +241 -0
  48. package/dist/like.d.ts +80 -0
  49. package/dist/like.d.ts.map +1 -0
  50. package/dist/like.js +5 -0
  51. package/dist/math/index.d.ts +16 -0
  52. package/dist/math/index.d.ts.map +1 -1
  53. package/dist/math/index.js +16 -0
  54. package/dist/math/rect.d.ts +24 -27
  55. package/dist/math/rect.d.ts.map +1 -1
  56. package/dist/math/rect.js +47 -73
  57. package/dist/math/vector2.d.ts +87 -32
  58. package/dist/math/vector2.d.ts.map +1 -1
  59. package/dist/math/vector2.js +92 -110
  60. package/dist/prefab-scenes/index.d.ts +1 -0
  61. package/dist/prefab-scenes/index.d.ts.map +1 -1
  62. package/dist/prefab-scenes/index.js +1 -0
  63. package/dist/prefab-scenes/mapGamepad.d.ts +28 -0
  64. package/dist/prefab-scenes/mapGamepad.d.ts.map +1 -0
  65. package/dist/prefab-scenes/mapGamepad.js +181 -0
  66. package/dist/prefab-scenes/startScreen.d.ts +2 -2
  67. package/dist/prefab-scenes/startScreen.js +2 -2
  68. package/dist/scene.d.ts +2 -2
  69. package/dist/scene.d.ts.map +1 -1
  70. package/dist/timer/index.d.ts +2 -0
  71. package/dist/timer/index.d.ts.map +1 -0
  72. package/dist/timer/index.js +1 -0
  73. package/dist/timer/timer.d.ts +32 -0
  74. package/dist/timer/timer.d.ts.map +1 -0
  75. package/dist/{core → timer}/timer.js +20 -3
  76. package/package.json +22 -13
  77. package/dist/core/audio.d.ts.map +0 -1
  78. package/dist/core/canvas.d.ts.map +0 -1
  79. package/dist/core/events.d.ts.map +0 -1
  80. package/dist/core/events.js +0 -21
  81. package/dist/core/gamepad-mapping.d.ts +0 -58
  82. package/dist/core/gamepad-mapping.d.ts.map +0 -1
  83. package/dist/core/gamepad-mapping.js +0 -23
  84. package/dist/core/gamepad.d.ts +0 -37
  85. package/dist/core/gamepad.d.ts.map +0 -1
  86. package/dist/core/gamepad.js +0 -103
  87. package/dist/core/graphics.d.ts.map +0 -1
  88. package/dist/core/input-state.d.ts +0 -14
  89. package/dist/core/input-state.d.ts.map +0 -1
  90. package/dist/core/input-state.js +0 -50
  91. package/dist/core/input.d.ts +0 -40
  92. package/dist/core/input.d.ts.map +0 -1
  93. package/dist/core/input.js +0 -105
  94. package/dist/core/keyboard.d.ts +0 -15
  95. package/dist/core/keyboard.d.ts.map +0 -1
  96. package/dist/core/like.d.ts +0 -113
  97. package/dist/core/like.d.ts.map +0 -1
  98. package/dist/core/like.js +0 -9
  99. package/dist/core/mouse.d.ts +0 -52
  100. package/dist/core/mouse.d.ts.map +0 -1
  101. package/dist/core/mouse.js +0 -142
  102. package/dist/core/timer.d.ts +0 -15
  103. package/dist/core/timer.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"graphics.d.ts","sourceRoot":"","sources":["../../src/core/graphics.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- export declare class InputStateTracker<T> {
2
- prevState: Set<T>;
3
- currState: Set<T>;
4
- update(pressedKeys: Set<T>): {
5
- justPressed: T[];
6
- justReleased: T[];
7
- };
8
- isDown(key: T): boolean;
9
- justPressed(key: T): boolean;
10
- justReleased(key: T): boolean;
11
- getCurrentState(): Set<T>;
12
- clear(): void;
13
- }
14
- //# sourceMappingURL=input-state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"input-state.d.ts","sourceRoot":"","sources":["../../src/core/input-state.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAiB,CAAC,CAAC;IACvB,SAAS,SAAgB;IACzB,SAAS,SAAgB;IAEhC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG;QAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAAC,YAAY,EAAE,CAAC,EAAE,CAAA;KAAE;IAuBpE,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIvB,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAI5B,YAAY,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAI7B,eAAe,IAAI,GAAG,CAAC,CAAC,CAAC;IAIzB,KAAK,IAAI,IAAI;CAId"}
@@ -1,50 +0,0 @@
1
- export class InputStateTracker {
2
- constructor() {
3
- Object.defineProperty(this, "prevState", {
4
- enumerable: true,
5
- configurable: true,
6
- writable: true,
7
- value: new Set()
8
- });
9
- Object.defineProperty(this, "currState", {
10
- enumerable: true,
11
- configurable: true,
12
- writable: true,
13
- value: new Set()
14
- });
15
- }
16
- update(pressedKeys) {
17
- const justPressed = [];
18
- const justReleased = [];
19
- const nextState = new Set(pressedKeys);
20
- for (const key of nextState) {
21
- if (!this.currState.has(key)) {
22
- justPressed.push(key);
23
- }
24
- }
25
- for (const key of this.currState) {
26
- if (!nextState.has(key)) {
27
- justReleased.push(key);
28
- }
29
- }
30
- this.prevState = new Set(this.currState);
31
- this.currState = nextState;
32
- return { justPressed, justReleased };
33
- }
34
- isDown(key) {
35
- return this.currState.has(key);
36
- }
37
- justPressed(key) {
38
- return !this.prevState.has(key) && this.currState.has(key);
39
- }
40
- justReleased(key) {
41
- return this.prevState.has(key) && !this.currState.has(key);
42
- }
43
- getCurrentState() {
44
- return new Set(this.currState);
45
- }
46
- clear() {
47
- this.prevState.clear();
48
- this.currState.clear();
49
- }
50
- }
@@ -1,40 +0,0 @@
1
- import type { KeyboardInternal } from './keyboard';
2
- import type { MouseInternal } from './mouse';
3
- import { GamepadTarget, GamepadInternal } from './gamepad';
4
- import { MouseButton } from './events';
5
- export type InputType = InputBinding['type'];
6
- export type InputBinding = {
7
- type: 'keyboard';
8
- scancode: string;
9
- } | {
10
- type: 'mouse';
11
- button: MouseButton;
12
- } | {
13
- type: 'gamepad';
14
- gamepad: GamepadTarget;
15
- button: number;
16
- };
17
- export declare class InputInternal {
18
- private actionMap;
19
- private actionStateTracker;
20
- private keyboard;
21
- private mouse;
22
- private gamepad;
23
- constructor(deps: {
24
- keyboard: KeyboardInternal;
25
- mouse: MouseInternal;
26
- gamepad: GamepadInternal;
27
- });
28
- setAction(action: string, inputs?: string[]): void;
29
- isDown(action: string): boolean;
30
- justPressed(action: string): boolean;
31
- justReleased(action: string): boolean;
32
- _update(): {
33
- pressed: string[];
34
- released: string[];
35
- };
36
- private parseInput;
37
- private isBindingActive;
38
- clear(): void;
39
- }
40
- //# sourceMappingURL=input.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/core/input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAC7C,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAkB;gBAErB,IAAI,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,eAAe,CAAA;KAAE;IAMhG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,IAAI;IAWtD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAO/B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIpC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IAgBpD,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,eAAe;IAcvB,KAAK,IAAI,IAAI;CAId"}
@@ -1,105 +0,0 @@
1
- import { GamepadInternal } from './gamepad';
2
- import { InputStateTracker } from './input-state';
3
- export class InputInternal {
4
- constructor(deps) {
5
- Object.defineProperty(this, "actionMap", {
6
- enumerable: true,
7
- configurable: true,
8
- writable: true,
9
- value: new Map()
10
- });
11
- Object.defineProperty(this, "actionStateTracker", {
12
- enumerable: true,
13
- configurable: true,
14
- writable: true,
15
- value: new InputStateTracker()
16
- });
17
- Object.defineProperty(this, "keyboard", {
18
- enumerable: true,
19
- configurable: true,
20
- writable: true,
21
- value: void 0
22
- });
23
- Object.defineProperty(this, "mouse", {
24
- enumerable: true,
25
- configurable: true,
26
- writable: true,
27
- value: void 0
28
- });
29
- Object.defineProperty(this, "gamepad", {
30
- enumerable: true,
31
- configurable: true,
32
- writable: true,
33
- value: void 0
34
- });
35
- this.keyboard = deps.keyboard;
36
- this.mouse = deps.mouse;
37
- this.gamepad = deps.gamepad;
38
- }
39
- setAction(action, inputs = []) {
40
- if (inputs.length) {
41
- const bindings = inputs.map(input => this.parseInput(input));
42
- this.actionMap.set(action, bindings);
43
- }
44
- else {
45
- this.actionMap.delete(action);
46
- this.actionStateTracker.currState.delete(action);
47
- this.actionStateTracker.prevState.delete(action);
48
- }
49
- }
50
- isDown(action) {
51
- const bindings = this.actionMap.get(action);
52
- if (!bindings)
53
- return false;
54
- return bindings.some(binding => this.isBindingActive(binding));
55
- }
56
- justPressed(action) {
57
- return this.actionStateTracker.justPressed(action);
58
- }
59
- justReleased(action) {
60
- return this.actionStateTracker.justReleased(action);
61
- }
62
- _update() {
63
- this.gamepad._update();
64
- const activeActions = new Set();
65
- for (const [action] of this.actionMap) {
66
- if (this.isDown(action)) {
67
- activeActions.add(action);
68
- }
69
- }
70
- const { justPressed, justReleased } = this.actionStateTracker.update(activeActions);
71
- return { pressed: justPressed, released: justReleased };
72
- }
73
- parseInput(input) {
74
- const normalized = input.trim();
75
- if (normalized.startsWith('Mouse')) {
76
- const buttonCode = normalized.replace('Mouse', '');
77
- return { type: 'mouse', button: buttonCode };
78
- }
79
- if (normalized.startsWith('Button') || normalized.startsWith('DP')) {
80
- return {
81
- type: "gamepad",
82
- gamepad: 0,
83
- button: GamepadInternal.getButtonNumber(normalized),
84
- };
85
- }
86
- return { type: 'keyboard', scancode: normalized };
87
- }
88
- isBindingActive(binding) {
89
- switch (binding.type) {
90
- case 'keyboard':
91
- return this.keyboard.isDown(binding.scancode);
92
- case 'mouse':
93
- return this.mouse.isDown(binding.button);
94
- case 'gamepad': {
95
- return !!this.gamepad.isButtonDown(binding.gamepad, binding.button);
96
- }
97
- default:
98
- return false;
99
- }
100
- }
101
- clear() {
102
- this.actionMap.clear();
103
- this.actionStateTracker.clear();
104
- }
105
- }
@@ -1,15 +0,0 @@
1
- import { EngineDispatch } from "../engine";
2
- export declare class KeyboardInternal {
3
- private dispatch;
4
- private pressedScancodes;
5
- private canvas;
6
- private abort;
7
- constructor(canvas: HTMLCanvasElement | null, dispatch: EngineDispatch);
8
- private handleKeyDown;
9
- private handleKeyUp;
10
- private handleBlur;
11
- _dispose(): void;
12
- isDown(scancode: string): boolean;
13
- isAnyDown(...scancodes: string[]): boolean;
14
- }
15
- //# sourceMappingURL=keyboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/core/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,qBAAa,gBAAgB;IAKmB,OAAO,CAAC,QAAQ;IAJ9D,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,KAAK,CAAyB;gBAE1B,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAAU,QAAQ,EAAE,cAAc;IAU9E,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,UAAU;IAIlB,QAAQ,IAAI,IAAI;IAKhB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIjC,SAAS,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO;CAG3C"}
@@ -1,113 +0,0 @@
1
- /**
2
- * @module like
3
- * @description A catalogue of subsystems
4
- *
5
- * This is how we know what's part of like.
6
- * `like.gfx`, `like.canvas`, and such.
7
- *
8
- */
9
- import type { AudioInternal } from './audio';
10
- import type { TimerInternal } from './timer';
11
- import type { InputInternal } from './input';
12
- import type { KeyboardInternal } from './keyboard';
13
- import type { MouseInternal } from './mouse';
14
- import type { GamepadInternal } from './gamepad';
15
- import type { CanvasInternal } from './canvas';
16
- import type { BoundGraphics } from './graphics';
17
- import { EventMap, EventType, LikeEvent } from './events';
18
- import { TopLevelEventHandler } from '..';
19
- import { Scene } from '../scene';
20
- type Callback<K extends EventType> = (...args: EventMap[K]) => void;
21
- type Callbacks = {
22
- [K in EventType]?: Callback<K>;
23
- };
24
- export type LikeInternal = Callbacks & {
25
- readonly audio: AudioInternal;
26
- readonly timer: TimerInternal;
27
- readonly input: InputInternal;
28
- readonly keyboard: KeyboardInternal;
29
- readonly mouse: MouseInternal;
30
- readonly gamepad: GamepadInternal;
31
- canvas: CanvasInternal;
32
- /** Graphics context for rendering operations */
33
- gfx: BoundGraphics;
34
- /**
35
- * Start the game loop. Call this only once.
36
- * @returns Promise that resolves when the engine is ready
37
- */
38
- start(): Promise<void>;
39
- /**
40
- * Clears out event listeners to avoid memory leaks.
41
- */
42
- dispose(): void;
43
- /**
44
- * A simple way to set the current scene, which acts like a pluggable
45
- * set of callbacks.
46
- *
47
- * Translates into `like.handleEvent = (event) => sceneDispatch(scene, like, event)`
48
- * followed by dispatching a `load` event.
49
- *
50
- * {@link Scene} for detailed usage.
51
- * @param scene Scene to load, leave out to use callbacks.
52
- */
53
- setScene(scene?: Scene): void;
54
- /**
55
- * LIKE's runtime is built around calling handleEvent.
56
- *
57
- * For more advanced LIKE users, overriding this function allows you
58
- * to create your own fundamental systems by writing an {@link TopLevelEventHandler}
59
- *
60
- * The built-in event handler amounts to calling `like[ev.type](...ev.args)`, as
61
- * does the scene one which is a bit more like `yourScene[ev.type](like, ...ev.args)`.
62
- *
63
- * The code for them is very short and simple. Take a look if you're interested
64
- * in building your own.
65
- */
66
- handleEvent?: TopLevelEventHandler;
67
- callOwnHandlers(event: LikeEvent): void;
68
- };
69
- /**
70
- * A little helper that hides methods with underscores.
71
- */
72
- type Public<T> = {
73
- [K in keyof T as K extends `_${string}` ? never : K]: T[K];
74
- };
75
- type Canvas = Public<CanvasInternal>;
76
- type Keyboard = Public<KeyboardInternal>;
77
- type Mouse = Public<MouseInternal>;
78
- type Audio = Public<AudioInternal>;
79
- type Timer = Public<TimerInternal>;
80
- type Input = Public<InputInternal>;
81
- type Gamepad = Public<GamepadInternal>;
82
- /**
83
- * The main Like instance.
84
- * Use this object much how you would the `love` object in Love2D.
85
- * This is the interface returned by {@link createLike}.
86
- *
87
- * Assigns callbacks to handle events. See {@link EventMap} for all available events.
88
- *
89
- * Don't forget to call `await start()` when you're ready,
90
- * and `dispose()` if you're done with it.
91
- */
92
- export type Like = LikeInternal & {
93
- /** Canvas settings, including even Pixel Art mode. */
94
- readonly canvas: Canvas;
95
- /** Synchronous audio handles with global control. */
96
- readonly audio: Audio;
97
- /** Timer system for tracking time, delta, FPS, and freezing the whole game. */
98
- readonly timer: Timer;
99
- /** Input system for action-based input handling */
100
- readonly input: Input;
101
- /** Keyboard input handling */
102
- readonly keyboard: Keyboard;
103
- /** Mouse input handling */
104
- readonly mouse: Mouse;
105
- /** Gamepad input handling */
106
- readonly gamepad: Gamepad;
107
- /** Look at {@link handleEvent} -- it serves the same purpose. */
108
- run?: never;
109
- /** I think you meant to type like.canvas instead. */
110
- window?: never;
111
- };
112
- export {};
113
- //# sourceMappingURL=like.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"like.d.ts","sourceRoot":"","sources":["../../src/core/like.ts"],"names":[],"mappings":"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"}
package/dist/core/like.js DELETED
@@ -1,9 +0,0 @@
1
- /**
2
- * @module like
3
- * @description A catalogue of subsystems
4
- *
5
- * This is how we know what's part of like.
6
- * `like.gfx`, `like.canvas`, and such.
7
- *
8
- */
9
- export {};
@@ -1,52 +0,0 @@
1
- import { EngineDispatch } from '../engine';
2
- import { type Vector2 } from '../math/vector2';
3
- import { type MouseButton } from './events';
4
- /**
5
- * Mouse input handling. Bound to canvas. Emits relative movement when pointer locked.
6
- * Buttons: 1 = left, 2 = middle, 3 = right.
7
- */
8
- export declare class MouseInternal {
9
- private canvas;
10
- private dispatch;
11
- private pos;
12
- private lastPos;
13
- private buttons;
14
- private cursorVisible;
15
- private abort;
16
- constructor(canvas: HTMLCanvasElement, dispatch: EngineDispatch);
17
- private handleMouseMove;
18
- private handleMouseDown;
19
- private handleMouseUp;
20
- private handleWheel;
21
- _dispose(): void;
22
- /** Mouse position, transformed to canvas pixels. */
23
- getPosition(): Vector2;
24
- /** Check if button is held. Button 1 = left, 2 = middle, 3 = right. */
25
- isDown(button: MouseButton): boolean;
26
- /** All currently held buttons. */
27
- getPressedButtons(): Set<MouseButton>;
28
- /** True when pointer is locked to canvas.
29
- * {@link lockPointer}
30
- */
31
- isPointerLocked(): boolean;
32
- /**
33
- * Whether to lock (capture) the pointer.
34
- *
35
- * In locked mode, the cursor cannot escape the canvas.
36
- * It also becomes invisible.
37
- *
38
- * Note that event {@link mousemoved} passes both
39
- * `pos` and `delta`.
40
- *
41
- * Though the emulated cursor in locked mode
42
- * (locked mode doesn't natively track absolute position)
43
- * may be stuck on canvas edges, the `delta` field always
44
- * represents mouse movement.
45
- */
46
- lockPointer(locked: boolean): void;
47
- /** Show or hide cursor. Unlike pointer lock, cursor can still leave canvas. */
48
- showCursor(visible: boolean): void;
49
- /** Current cursor visibility state. */
50
- isCursorVisible(): boolean;
51
- }
52
- //# sourceMappingURL=mouse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../src/core/mouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAQ,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C;;;GAGG;AACH,qBAAa,aAAa;IAOZ,OAAO,CAAC,MAAM;IAAqB,OAAO,CAAC,QAAQ;IAN/D,OAAO,CAAC,GAAG,CAAmB;IAC9B,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,KAAK,CAAyB;gBAElB,MAAM,EAAE,iBAAiB,EAAU,QAAQ,EAAE,cAAc;IAQ/E,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;IAInB,QAAQ,IAAI,IAAI;IAIhB,oDAAoD;IACpD,WAAW,IAAI,OAAO;IAItB,uEAAuE;IACvE,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO;IAIpC,kCAAkC;IAClC,iBAAiB,IAAI,GAAG,CAAC,WAAW,CAAC;IAIrC;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;;;;;;;;;;;;MAaE;IACF,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAUlC,+EAA+E;IAC/E,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOlC,uCAAuC;IACvC,eAAe,IAAI,OAAO;CAG3B"}
@@ -1,142 +0,0 @@
1
- import { Vec2 } from '../math/vector2';
2
- const mouseButtons = ["left", "middle", "right"];
3
- const numToButton = (i) => mouseButtons[i];
4
- /**
5
- * Mouse input handling. Bound to canvas. Emits relative movement when pointer locked.
6
- * Buttons: 1 = left, 2 = middle, 3 = right.
7
- */
8
- export class MouseInternal {
9
- constructor(canvas, dispatch) {
10
- Object.defineProperty(this, "canvas", {
11
- enumerable: true,
12
- configurable: true,
13
- writable: true,
14
- value: canvas
15
- });
16
- Object.defineProperty(this, "dispatch", {
17
- enumerable: true,
18
- configurable: true,
19
- writable: true,
20
- value: dispatch
21
- });
22
- Object.defineProperty(this, "pos", {
23
- enumerable: true,
24
- configurable: true,
25
- writable: true,
26
- value: [0, 0]
27
- });
28
- Object.defineProperty(this, "lastPos", {
29
- enumerable: true,
30
- configurable: true,
31
- writable: true,
32
- value: [0, 0]
33
- });
34
- Object.defineProperty(this, "buttons", {
35
- enumerable: true,
36
- configurable: true,
37
- writable: true,
38
- value: new Set()
39
- });
40
- Object.defineProperty(this, "cursorVisible", {
41
- enumerable: true,
42
- configurable: true,
43
- writable: true,
44
- value: true
45
- });
46
- Object.defineProperty(this, "abort", {
47
- enumerable: true,
48
- configurable: true,
49
- writable: true,
50
- value: new AbortController()
51
- });
52
- this.canvas.addEventListener('like:mousemoved', this.handleMouseMove.bind(this), { signal: this.abort.signal });
53
- this.canvas.addEventListener('mousedown', this.handleMouseDown.bind(this), { signal: this.abort.signal });
54
- window.addEventListener('mouseup', this.handleMouseUp.bind(this), { signal: this.abort.signal });
55
- this.canvas.addEventListener('wheel', this.handleWheel.bind(this), { passive: false, signal: this.abort.signal });
56
- this.canvas.addEventListener('mouseleave', () => this.buttons.clear(), { signal: this.abort.signal });
57
- }
58
- handleMouseMove(e) {
59
- if (this.isPointerLocked()) {
60
- /** In pointer-lock mode, simulate a real cursor bounded by the canvas. */
61
- this.pos = Vec2.clamp(Vec2.add(this.pos, e.detail.delta), [0, 0], e.detail.renderSize);
62
- this.dispatch('mousemoved', [this.pos, e.detail.delta]);
63
- }
64
- else {
65
- /** In non-pointer locked mode, calculate deltas ourselves. */
66
- this.pos = e.detail.pos;
67
- this.dispatch('mousemoved', [this.pos, Vec2.sub(this.pos, this.lastPos)]);
68
- }
69
- this.lastPos = this.pos;
70
- }
71
- handleMouseDown(e) {
72
- // hack: ignore right clicks because they cause a refocus
73
- if (!this.isPointerLocked() && e.button == 2)
74
- return;
75
- this.buttons.add(numToButton(e.button));
76
- this.dispatch('mousepressed', [[e.offsetX, e.offsetY], numToButton(e.button)]);
77
- this.canvas?.focus();
78
- }
79
- handleMouseUp(e) {
80
- this.buttons.delete(numToButton(e.button));
81
- this.dispatch('mousereleased', [[e.offsetX, e.offsetY], numToButton(e.button)]);
82
- }
83
- handleWheel(e) {
84
- e.preventDefault();
85
- }
86
- _dispose() {
87
- this.abort.abort();
88
- }
89
- /** Mouse position, transformed to canvas pixels. */
90
- getPosition() {
91
- return this.pos;
92
- }
93
- /** Check if button is held. Button 1 = left, 2 = middle, 3 = right. */
94
- isDown(button) {
95
- return this.buttons.has(button);
96
- }
97
- /** All currently held buttons. */
98
- getPressedButtons() {
99
- return new Set(this.buttons);
100
- }
101
- /** True when pointer is locked to canvas.
102
- * {@link lockPointer}
103
- */
104
- isPointerLocked() {
105
- return document.pointerLockElement !== null;
106
- }
107
- /**
108
- * Whether to lock (capture) the pointer.
109
- *
110
- * In locked mode, the cursor cannot escape the canvas.
111
- * It also becomes invisible.
112
- *
113
- * Note that event {@link mousemoved} passes both
114
- * `pos` and `delta`.
115
- *
116
- * Though the emulated cursor in locked mode
117
- * (locked mode doesn't natively track absolute position)
118
- * may be stuck on canvas edges, the `delta` field always
119
- * represents mouse movement.
120
- */
121
- lockPointer(locked) {
122
- if (!this.canvas)
123
- return;
124
- if (locked && document.pointerLockElement !== this.canvas) {
125
- this.canvas.requestPointerLock();
126
- }
127
- else if (!locked && document.pointerLockElement === this.canvas) {
128
- document.exitPointerLock();
129
- }
130
- }
131
- /** Show or hide cursor. Unlike pointer lock, cursor can still leave canvas. */
132
- showCursor(visible) {
133
- this.cursorVisible = visible;
134
- if (this.canvas) {
135
- this.canvas.style.cursor = visible ? 'auto' : 'none';
136
- }
137
- }
138
- /** Current cursor visibility state. */
139
- isCursorVisible() {
140
- return this.cursorVisible;
141
- }
142
- }
@@ -1,15 +0,0 @@
1
- export declare class TimerInternal {
2
- private currentDelta;
3
- private totalTime;
4
- private frameCount;
5
- private fps;
6
- private fpsAccumulator;
7
- private sleepUntil;
8
- _update(dt: number): void;
9
- getDelta(): number;
10
- getFPS(): number;
11
- getTime(): number;
12
- isSleeping(): boolean;
13
- sleep(duration: number): void;
14
- }
15
- //# sourceMappingURL=timer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../../src/core/timer.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,UAAU,CAAuB;IAEzC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAazB,QAAQ,IAAI,MAAM;IAIlB,MAAM,IAAI,MAAM;IAIhB,OAAO,IAAI,MAAM;IAIjB,UAAU,IAAI,OAAO;IAUrB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAG9B"}