like2d 2.7.4 → 2.9.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 (77) hide show
  1. package/README.md +34 -35
  2. package/dist/core/audio.d.ts +12 -9
  3. package/dist/core/audio.d.ts.map +1 -1
  4. package/dist/core/audio.js +7 -4
  5. package/dist/core/canvas.d.ts +58 -0
  6. package/dist/core/canvas.d.ts.map +1 -0
  7. package/dist/core/canvas.js +209 -0
  8. package/dist/core/events.d.ts +92 -7
  9. package/dist/core/events.d.ts.map +1 -1
  10. package/dist/core/events.js +20 -0
  11. package/dist/core/gamepad-mapping.d.ts +57 -18
  12. package/dist/core/gamepad-mapping.d.ts.map +1 -1
  13. package/dist/core/gamepad-mapping.js +23 -223
  14. package/dist/core/gamepad.d.ts +34 -58
  15. package/dist/core/gamepad.d.ts.map +1 -1
  16. package/dist/core/gamepad.js +79 -213
  17. package/dist/core/graphics.d.ts +175 -64
  18. package/dist/core/graphics.d.ts.map +1 -1
  19. package/dist/core/graphics.js +294 -198
  20. package/dist/core/input-state.d.ts +2 -2
  21. package/dist/core/input-state.d.ts.map +1 -1
  22. package/dist/core/input.d.ts +22 -15
  23. package/dist/core/input.d.ts.map +1 -1
  24. package/dist/core/input.js +25 -37
  25. package/dist/core/keyboard.d.ts +7 -7
  26. package/dist/core/keyboard.d.ts.map +1 -1
  27. package/dist/core/keyboard.js +24 -31
  28. package/dist/core/like.d.ts +98 -44
  29. package/dist/core/like.d.ts.map +1 -1
  30. package/dist/core/like.js +8 -0
  31. package/dist/core/mouse.d.ts +45 -22
  32. package/dist/core/mouse.d.ts.map +1 -1
  33. package/dist/core/mouse.js +90 -78
  34. package/dist/core/timer.d.ts +2 -5
  35. package/dist/core/timer.d.ts.map +1 -1
  36. package/dist/core/timer.js +2 -14
  37. package/dist/engine.d.ts +61 -11
  38. package/dist/engine.d.ts.map +1 -1
  39. package/dist/engine.js +119 -102
  40. package/dist/index.d.ts +42 -21
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +35 -14
  43. package/dist/math/index.d.ts +2 -0
  44. package/dist/math/index.d.ts.map +1 -0
  45. package/dist/math/index.js +1 -0
  46. package/dist/math/rect.d.ts +71 -0
  47. package/dist/math/rect.d.ts.map +1 -0
  48. package/dist/{core → math}/rect.js +8 -0
  49. package/dist/math/vector2.d.ts +78 -0
  50. package/dist/math/vector2.d.ts.map +1 -0
  51. package/dist/{core → math}/vector2.js +24 -0
  52. package/dist/prefab-scenes/index.d.ts +7 -0
  53. package/dist/prefab-scenes/index.d.ts.map +1 -0
  54. package/dist/prefab-scenes/index.js +6 -0
  55. package/dist/prefab-scenes/startScreen.d.ts +59 -0
  56. package/dist/prefab-scenes/startScreen.d.ts.map +1 -0
  57. package/dist/{scenes/startup.js → prefab-scenes/startScreen.js} +47 -7
  58. package/dist/scene.d.ts +103 -5
  59. package/dist/scene.d.ts.map +1 -1
  60. package/dist/scene.js +28 -1
  61. package/package.json +18 -2
  62. package/dist/core/canvas-config.d.ts +0 -22
  63. package/dist/core/canvas-config.d.ts.map +0 -1
  64. package/dist/core/canvas-config.js +0 -14
  65. package/dist/core/canvas-manager.d.ts +0 -25
  66. package/dist/core/canvas-manager.d.ts.map +0 -1
  67. package/dist/core/canvas-manager.js +0 -178
  68. package/dist/core/gamepad-buttons.d.ts +0 -23
  69. package/dist/core/gamepad-buttons.d.ts.map +0 -1
  70. package/dist/core/gamepad-buttons.js +0 -36
  71. package/dist/core/rect.d.ts +0 -26
  72. package/dist/core/rect.d.ts.map +0 -1
  73. package/dist/core/vector2.d.ts +0 -26
  74. package/dist/core/vector2.d.ts.map +0 -1
  75. package/dist/gamecontrollerdb.txt +0 -2221
  76. package/dist/scenes/startup.d.ts +0 -18
  77. package/dist/scenes/startup.d.ts.map +0 -1
@@ -1,16 +1,6 @@
1
+ import { GamepadInternal } from './gamepad';
1
2
  import { InputStateTracker } from './input-state';
2
- import { GP_NAME_MAP } from './gamepad-buttons';
3
- const buttonMap = {
4
- 'Left': 1,
5
- 'Right': 3,
6
- 'Middle': 2,
7
- '1': 1,
8
- '2': 2,
9
- '3': 3,
10
- '4': 4,
11
- '5': 5,
12
- };
13
- export class Input {
3
+ export class InputInternal {
14
4
  constructor(deps) {
15
5
  Object.defineProperty(this, "actionMap", {
16
6
  enumerable: true,
@@ -46,13 +36,16 @@ export class Input {
46
36
  this.mouse = deps.mouse;
47
37
  this.gamepad = deps.gamepad;
48
38
  }
49
- map(action, inputs) {
50
- const bindings = inputs.map(input => this.parseInput(input));
51
- this.actionMap.set(action, bindings);
52
- }
53
- unmap(action) {
54
- this.actionMap.delete(action);
55
- this.actionStateTracker.clear();
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
+ }
56
49
  }
57
50
  isDown(action) {
58
51
  const bindings = this.actionMap.get(action);
@@ -66,8 +59,8 @@ export class Input {
66
59
  justReleased(action) {
67
60
  return this.actionStateTracker.justReleased(action);
68
61
  }
69
- update() {
70
- this.gamepad.update();
62
+ _update() {
63
+ this.gamepad._update();
71
64
  const activeActions = new Set();
72
65
  for (const [action] of this.actionMap) {
73
66
  if (this.isDown(action)) {
@@ -81,30 +74,25 @@ export class Input {
81
74
  const normalized = input.trim();
82
75
  if (normalized.startsWith('Mouse')) {
83
76
  const buttonCode = normalized.replace('Mouse', '');
84
- return { type: 'mouse', code: buttonCode };
77
+ return { type: 'mouse', button: buttonCode };
85
78
  }
86
79
  if (normalized.startsWith('Button') || normalized.startsWith('DP')) {
87
- return { type: 'gamepad', code: normalized };
80
+ return {
81
+ type: "gamepad",
82
+ gamepad: 0,
83
+ button: GamepadInternal.getButtonNumber(normalized),
84
+ };
88
85
  }
89
- return { type: 'keyboard', code: normalized };
86
+ return { type: 'keyboard', scancode: normalized };
90
87
  }
91
88
  isBindingActive(binding) {
92
89
  switch (binding.type) {
93
90
  case 'keyboard':
94
- return this.keyboard.isDown(binding.code);
95
- case 'mouse': {
96
- const button = buttonMap[binding.code];
97
- if (button !== undefined) {
98
- return this.mouse.isDown(button);
99
- }
100
- return false;
101
- }
91
+ return this.keyboard.isDown(binding.scancode);
92
+ case 'mouse':
93
+ return this.mouse.isDown(binding.button);
102
94
  case 'gamepad': {
103
- const buttonIndex = GP_NAME_MAP[binding.code];
104
- if (buttonIndex !== undefined) {
105
- return this.gamepad.isButtonDownOnAny(buttonIndex);
106
- }
107
- return false;
95
+ return !!this.gamepad.isButtonDown(binding.gamepad, binding.button);
108
96
  }
109
97
  default:
110
98
  return false;
@@ -1,14 +1,14 @@
1
- export declare class Keyboard {
1
+ import { EngineDispatch } from "../engine";
2
+ export declare class KeyboardInternal {
3
+ private dispatch;
2
4
  private pressedScancodes;
3
- onKeyEvent?: (scancode: string, keycode: string, type: 'keydown' | 'keyup') => void;
4
- private keydownHandler;
5
- private keyupHandler;
6
- private blurHandler;
7
- constructor();
5
+ private canvas;
6
+ private abort;
7
+ constructor(canvas: HTMLCanvasElement | null, dispatch: EngineDispatch);
8
8
  private handleKeyDown;
9
9
  private handleKeyUp;
10
10
  private handleBlur;
11
- dispose(): void;
11
+ _dispose(): void;
12
12
  isDown(scancode: string): boolean;
13
13
  isAnyDown(...scancodes: string[]): boolean;
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/core/keyboard.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACnB,OAAO,CAAC,gBAAgB,CAAqB;IACtC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC;IAG3F,OAAO,CAAC,cAAc,CAAwC;IAC9D,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,WAAW,CAAa;;IAchC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,UAAU;IAIlB,OAAO,IAAI,IAAI;IAOf,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIjC,SAAS,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO;CAG3C"}
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,64 +1,57 @@
1
- export class Keyboard {
2
- constructor() {
3
- Object.defineProperty(this, "pressedScancodes", {
4
- enumerable: true,
5
- configurable: true,
6
- writable: true,
7
- value: new Set()
8
- });
9
- Object.defineProperty(this, "onKeyEvent", {
1
+ export class KeyboardInternal {
2
+ constructor(canvas, dispatch) {
3
+ Object.defineProperty(this, "dispatch", {
10
4
  enumerable: true,
11
5
  configurable: true,
12
6
  writable: true,
13
- value: void 0
7
+ value: dispatch
14
8
  });
15
- // Event handler references for cleanup
16
- Object.defineProperty(this, "keydownHandler", {
9
+ Object.defineProperty(this, "pressedScancodes", {
17
10
  enumerable: true,
18
11
  configurable: true,
19
12
  writable: true,
20
- value: void 0
13
+ value: new Set()
21
14
  });
22
- Object.defineProperty(this, "keyupHandler", {
15
+ Object.defineProperty(this, "canvas", {
23
16
  enumerable: true,
24
17
  configurable: true,
25
18
  writable: true,
26
- value: void 0
19
+ value: null
27
20
  });
28
- Object.defineProperty(this, "blurHandler", {
21
+ Object.defineProperty(this, "abort", {
29
22
  enumerable: true,
30
23
  configurable: true,
31
24
  writable: true,
32
- value: void 0
25
+ value: new AbortController()
33
26
  });
34
- // Bind event handlers
35
- this.keydownHandler = this.handleKeyDown.bind(this);
36
- this.keyupHandler = this.handleKeyUp.bind(this);
37
- this.blurHandler = this.handleBlur.bind(this);
38
- // Register event listeners
39
- window.addEventListener('keydown', this.keydownHandler);
40
- window.addEventListener('keyup', this.keyupHandler);
41
- window.addEventListener('blur', this.blurHandler);
27
+ this.canvas = canvas;
28
+ if (this.canvas) {
29
+ this.canvas.addEventListener('keydown', this.handleKeyDown.bind(this), { signal: this.abort.signal });
30
+ this.canvas.addEventListener('keyup', this.handleKeyUp.bind(this), { signal: this.abort.signal });
31
+ this.canvas.addEventListener('blur', this.handleBlur.bind(this), { signal: this.abort.signal });
32
+ }
42
33
  }
43
34
  handleKeyDown(e) {
35
+ const scrollKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Space', 'PageUp', 'PageDown', 'Home', 'End'];
36
+ if (scrollKeys.includes(e.code)) {
37
+ e.preventDefault();
38
+ }
44
39
  if (e.code) {
45
40
  this.pressedScancodes.add(e.code);
46
41
  }
47
- this.onKeyEvent?.(e.code, e.key, 'keydown');
42
+ this.dispatch('keypressed', [e.code, e.key]);
48
43
  }
49
44
  handleKeyUp(e) {
50
45
  if (e.code) {
51
46
  this.pressedScancodes.delete(e.code);
52
47
  }
53
- this.onKeyEvent?.(e.code, e.key, 'keyup');
48
+ this.dispatch('keyreleased', [e.code, e.key]);
54
49
  }
55
50
  handleBlur() {
56
51
  this.pressedScancodes.clear();
57
52
  }
58
- dispose() {
59
- window.removeEventListener('keydown', this.keydownHandler);
60
- window.removeEventListener('keyup', this.keyupHandler);
61
- window.removeEventListener('blur', this.blurHandler);
53
+ _dispose() {
54
+ this.abort.abort();
62
55
  this.pressedScancodes.clear();
63
56
  }
64
57
  isDown(scancode) {
@@ -1,23 +1,100 @@
1
- import type { Audio } from './audio';
2
- import type { Timer } from './timer';
3
- import type { Input } from './input';
4
- import type { Keyboard } from './keyboard';
5
- import type { Mouse } from './mouse';
6
- import type { Gamepad } from './gamepad';
7
- import type { Vector2 } from './vector2';
8
- import type { CanvasMode, PartialCanvasMode } from './canvas-config';
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';
9
16
  import type { BoundGraphics } from './graphics';
10
- import type { Scene } from '../scene';
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
+ };
11
69
  /**
12
- * The Like interface provides access to all core systems and APIs
13
- * that are passed to game callbacks (load, update, draw, etc.).
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.
14
88
  *
15
- * This is the main interface for interacting with the engine's subsystems.
89
+ * Don't forget to call `await start()` when you're ready,
90
+ * and `dispose()` if you're done with it.
16
91
  */
17
- export interface Like {
18
- /** Audio system for managing and playing sounds */
92
+ export type Like = LikeInternal & {
93
+ /** Canvas settings, including even Pixel Art mode. */
94
+ readonly canvas: Canvas;
95
+ /** Synchronous audio handles with global control. */
19
96
  readonly audio: Audio;
20
- /** Timer system for tracking time, delta, and FPS */
97
+ /** Timer system for tracking time, delta, FPS, and freezing the whole game. */
21
98
  readonly timer: Timer;
22
99
  /** Input system for action-based input handling */
23
100
  readonly input: Input;
@@ -27,33 +104,10 @@ export interface Like {
27
104
  readonly mouse: Mouse;
28
105
  /** Gamepad input handling */
29
106
  readonly gamepad: Gamepad;
30
- /** Graphics context for rendering operations */
31
- readonly gfx: BoundGraphics;
32
- /**
33
- * Set the canvas display mode.
34
- * @param mode - Partial canvas mode configuration
35
- */
36
- setMode(mode: PartialCanvasMode): void;
37
- /**
38
- * Get the current canvas mode configuration.
39
- * @returns The current canvas mode or undefined if not available
40
- */
41
- getMode(): CanvasMode | undefined;
42
- /**
43
- * Get the current canvas size in pixels.
44
- * @returns The canvas size as a Vector2 [width, height]
45
- */
46
- getCanvasSize(): Vector2;
47
- /**
48
- * Set the active scene. Pass null to revert to global callbacks.
49
- */
50
- setScene(scene: Scene | null): void;
51
- }
52
- export type { Audio, Source, SourceOptions } from './audio';
53
- export type { Timer } from './timer';
54
- export type { Input, InputBinding, InputType } from './input';
55
- export type { Keyboard } from './keyboard';
56
- export type { Mouse, MousePositionTransform } from './mouse';
57
- export type { Gamepad, StickPosition, ButtonCallback } from './gamepad';
58
- export type { CanvasMode, PartialCanvasMode } from './canvas-config';
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 {};
59
113
  //# sourceMappingURL=like.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"like.d.ts","sourceRoot":"","sources":["../../src/core/like.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,WAAW,IAAI;IACnB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B,gDAAgD;IAChD,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAE5B;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAEvC;;;OAGG;IACH,OAAO,IAAI,UAAU,GAAG,SAAS,CAAC;IAElC;;;OAGG;IACH,aAAa,IAAI,OAAO,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;CACrC;AAGD,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5D,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC7D,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACxE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"like.d.ts","sourceRoot":"","sources":["../../src/core/like.ts"],"names":[],"mappings":"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"}
package/dist/core/like.js CHANGED
@@ -1 +1,9 @@
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
+ */
1
9
  export {};
@@ -1,29 +1,52 @@
1
- import type { Vector2 } from './vector2';
2
- export type MousePositionTransform = (cssX: number, cssY: number) => Vector2;
3
- export declare class Mouse {
4
- private x;
5
- private y;
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;
6
13
  private buttons;
7
- onMouseEvent?: (clientX: number, clientY: number, button: number | undefined, type: 'mousemove' | 'mousedown' | 'mouseup') => void;
8
- private transformFn?;
9
- private mousemoveHandler;
10
- private mousedownHandler;
11
- private mouseupHandler;
12
- private blurHandler;
13
- constructor(transformFn?: MousePositionTransform);
14
- setTransform(transformFn: MousePositionTransform | undefined): void;
14
+ private cursorVisible;
15
+ private abort;
16
+ constructor(canvas: HTMLCanvasElement, dispatch: EngineDispatch);
15
17
  private handleMouseMove;
16
18
  private handleMouseDown;
17
19
  private handleMouseUp;
18
- private handleBlur;
19
- dispose(): void;
20
+ private handleWheel;
21
+ _dispose(): void;
22
+ /** Mouse position, transformed to canvas pixels. */
20
23
  getPosition(): Vector2;
21
- getX(): number;
22
- getY(): number;
23
- isDown(button: number): boolean;
24
- getPressedButtons(): Set<number>;
25
- isVisible(): boolean;
26
- setVisible(visible: boolean, canvas?: HTMLCanvasElement): void;
27
- getRelativeMode(): boolean;
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;
28
51
  }
29
52
  //# sourceMappingURL=mouse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../src/core/mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;AAE7E,qBAAa,KAAK;IAChB,OAAO,CAAC,CAAC,CAAK;IACd,OAAO,CAAC,CAAC,CAAK;IACd,OAAO,CAAC,OAAO,CAAqB;IAC7B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1I,OAAO,CAAC,WAAW,CAAC,CAAyB;IAG7C,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,gBAAgB,CAAqC;IAC7D,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,WAAW,CAAa;gBAEpB,WAAW,CAAC,EAAE,sBAAsB;IAgBhD,YAAY,CAAC,WAAW,EAAE,sBAAsB,GAAG,SAAS,GAAG,IAAI;IAInE,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,UAAU;IAIlB,OAAO,IAAI,IAAI;IAQf,WAAW,IAAI,OAAO;IAOtB,IAAI,IAAI,MAAM;IAId,IAAI,IAAI,MAAM;IAId,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/B,iBAAiB,IAAI,GAAG,CAAC,MAAM,CAAC;IAIhC,SAAS,IAAI,OAAO;IAIpB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI;IAQ9D,eAAe,IAAI,OAAO;CAG3B"}
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"}