like2d 2.2.0 → 2.4.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.
@@ -5,7 +5,7 @@ import { Timer } from '../../core/timer';
5
5
  import { Keyboard } from '../../core/keyboard';
6
6
  import { Mouse } from '../../core/mouse';
7
7
  import { Gamepad } from '../../core/gamepad';
8
- import type { CanvasConfig } from '../../core/canvas-config';
8
+ import type { CanvasMode, PartialCanvasMode } from '../../core/canvas-config';
9
9
  import type { Like2DEvent } from '../../core/events';
10
10
  import type { Vector2 } from '../../core/vector2';
11
11
  export { ImageHandle } from '../../core/graphics';
@@ -13,6 +13,7 @@ export { getGPName, GP } from '../../core/gamepad';
13
13
  export { Vec2 } from '../../core/vector2';
14
14
  export { Rect } from '../../core/rect';
15
15
  export { calcFixedScale } from '../../core/canvas-config';
16
+ export type { CanvasMode, PartialCanvasMode } from '../../core/canvas-config';
16
17
  export declare let graphics: Graphics;
17
18
  export declare const audio: Audio;
18
19
  export declare const timer: Timer;
@@ -34,8 +35,8 @@ export declare const like: {
34
35
  actionpressed: ((action: string) => void) | undefined;
35
36
  actionreleased: ((action: string) => void) | undefined;
36
37
  handleEvent: ((event: Like2DEvent) => void) | undefined;
37
- toggleFullscreen(): void;
38
- setScaling(config: CanvasConfig): void;
38
+ setMode(mode: PartialCanvasMode): void;
39
+ getMode(): CanvasMode | undefined;
39
40
  init(container: HTMLElement): Promise<void>;
40
41
  dispose(): void;
41
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/callback/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAO,IAAI,QAAQ,EAAE,QAAQ,CAAC;AAC9B,eAAO,MAAM,KAAK,OAAc,CAAC;AACjC,eAAO,MAAM,KAAK,OAAc,CAAC;AACjC,eAAO,IAAI,QAAQ,EAAE,QAAQ,CAAC;AAC9B,eAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AACxB,eAAO,IAAI,OAAO,EAAE,OAAO,CAAC;AAC5B,eAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAIxB,eAAO,MAAM,IAAI;UACI,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS;YACtB,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;UACpC,CAAC,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,SAAS;YAC/C,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS;gBAC1E,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;iBACxD,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;kBACxD,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;mBAC3D,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;oBAC3D,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;qBACtD,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;mBACzD,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;oBACrC,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS;iBACzC,CAAC,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC,GAAG,SAAS;wBAEhD,IAAI;uBAIL,YAAY,GAAG,IAAI;oBAIhB,WAAW;eAyBtB,IAAI;CAkBhB,CAAC;AAEF,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/callback/index.ts"],"names":[],"mappings":"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"}
@@ -33,11 +33,11 @@ export const like = {
33
33
  actionpressed: undefined,
34
34
  actionreleased: undefined,
35
35
  handleEvent: undefined,
36
- toggleFullscreen() {
37
- engine?.toggleFullscreen();
36
+ setMode(mode) {
37
+ engine?.setMode(mode);
38
38
  },
39
- setScaling(config) {
40
- engine?.setScaling(config);
39
+ getMode() {
40
+ return engine?.getMode();
41
41
  },
42
42
  async init(container) {
43
43
  engine = new Engine(container);
@@ -6,7 +6,7 @@ import { Keyboard } from '../../core/keyboard';
6
6
  import { Mouse } from '../../core/mouse';
7
7
  import { Gamepad } from '../../core/gamepad';
8
8
  import type { Scene } from './scene';
9
- import type { CanvasConfig } from '../../core/canvas-config';
9
+ import type { CanvasMode, PartialCanvasMode } from '../../core/canvas-config';
10
10
  import { StartupScene } from './startup-scene';
11
11
  export { Graphics, ImageHandle } from '../../core/graphics';
12
12
  export { StartupScene };
@@ -21,7 +21,7 @@ export type { Scene } from './scene';
21
21
  export type { Vector2 } from '../../core/vector2';
22
22
  export { Vec2 } from '../../core/vector2';
23
23
  export { Rect } from '../../core/rect';
24
- export type { CanvasConfig } from '../../core/canvas-config';
24
+ export type { CanvasMode, PartialCanvasMode } from '../../core/canvas-config';
25
25
  export { calcFixedScale } from '../../core/canvas-config';
26
26
  export declare class SceneRunner {
27
27
  private engine;
@@ -34,7 +34,8 @@ export declare class SceneRunner {
34
34
  readonly mouse: Mouse;
35
35
  readonly gamepad: Gamepad;
36
36
  constructor(container: HTMLElement);
37
- setScaling(config: CanvasConfig): void;
37
+ setMode(mode: PartialCanvasMode): void;
38
+ getMode(): CanvasMode;
38
39
  setScene(scene: Scene): void;
39
40
  start(scene: Scene): Promise<void>;
40
41
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/scene/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,WAAW,IAAI,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC9D,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAsB;IAEnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,SAAS,EAAE,WAAW;IAWlC,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAItC,QAAQ,CAAC,KAAK,EAAE,KAAK;IAKf,KAAK,CAAC,KAAK,EAAE,KAAK;IAiBxB,OAAO,IAAI,IAAI;CAKhB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/scene/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,WAAW,IAAI,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC9D,YAAY,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAsB;IAEnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,SAAS,EAAE,WAAW;IAWlC,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAItC,OAAO,IAAI,UAAU;IAIrB,QAAQ,CAAC,KAAK,EAAE,KAAK;IAKf,KAAK,CAAC,KAAK,EAAE,KAAK;IAiBxB,OAAO,IAAI,IAAI;CAKhB"}
@@ -83,8 +83,11 @@ export class SceneRunner {
83
83
  this.timer = new Timer();
84
84
  this.audio = new Audio();
85
85
  }
86
- setScaling(config) {
87
- this.engine.setScaling(config);
86
+ setMode(mode) {
87
+ this.engine.setMode(mode);
88
+ }
89
+ getMode() {
90
+ return this.engine.getMode();
88
91
  }
89
92
  setScene(scene) {
90
93
  this.scene = scene;
@@ -1,17 +1,19 @@
1
- import type { Like2DEvent } from '../../core/events';
2
1
  import type { Scene } from './scene';
3
2
  import type { Graphics } from '../../core/graphics';
3
+ import { ImageHandle } from '../../core/graphics';
4
4
  export type StartupSceneConfig = {
5
5
  nextScene: Scene;
6
6
  draw?: (g: Graphics, canvas: HTMLCanvasElement) => void;
7
+ logo?: ImageHandle;
7
8
  };
8
9
  export declare class StartupScene implements Scene {
9
10
  private graphics;
10
11
  private config;
11
- private onStart;
12
+ private setScene;
12
13
  private started;
13
- constructor(graphics: Graphics, config: StartupSceneConfig, onStart: () => void);
14
+ private logo;
15
+ constructor(graphics: Graphics, config: StartupSceneConfig, setScene: (scene: Scene) => void);
14
16
  draw(canvas: HTMLCanvasElement): void;
15
- handleEvent(event: Like2DEvent): void;
17
+ mousepressed(_x: number, _y: number, _button: number): void;
16
18
  }
17
19
  //# sourceMappingURL=startup-scene.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"startup-scene.d.ts","sourceRoot":"","sources":["../../../src/adapters/scene/startup-scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,KAAK,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACzD,CAAC;AAMF,qBAAa,YAAa,YAAW,KAAK;IAItC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,OAAO,CAAS;gBAGd,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,MAAM,IAAI;IAK7B,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAIrC,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;CAMtC"}
1
+ {"version":3,"file":"startup-scene.d.ts","sourceRoot":"","sources":["../../../src/adapters/scene/startup-scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIlD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,KAAK,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACxD,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB,CAAC;AA6BF,qBAAa,YAAa,YAAW,KAAK;IAKtC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IANlB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,IAAI,CAAc;gBAGhB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;IAM1C,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAIrC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CAM5D"}
@@ -1,8 +1,28 @@
1
- function defaultDraw(g, canvas) {
2
- g.print('white', 'Click to Start', [canvas.width / 2, canvas.height / 2], { align: 'center' });
1
+ import { Vec2 } from '../../core/vector2';
2
+ import { Rect } from '../../core/rect';
3
+ // Base64-encoded Like2D logo (logo-banner-optimized.svg)
4
+ const LOGO_DATA_URI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMzAwbW0iIGhlaWdodD0iMTA1bW0iIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDMwMCAxMDUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiA8cmVjdCB4PSIxMCIgeT0iMTEuMjMiIHdpZHRoPSIyODAiIGhlaWdodD0iODMuNTQ0IiBmaWxsPSIjZTQ4MDgwIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIvPgogPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4KICA8cmVjdCB4PSI5Ny40ODQiIHk9IjExLjIzIiB3aWR0aD0iNTIuNTE2IiBoZWlnaHQ9IjQ2LjIzNyIvPgogIDxyZWN0IHg9IjE1MCIgeT0iMTEuMjMiIHdpZHRoPSIzNS4wMTEiIGhlaWdodD0iNDYuMjM3Ii8+CiAgPHJlY3QgeD0iMTg1LjAxIiB5PSIxMS4yMyIgd2lkdGg9IjUyLjUxNiIgaGVpZ2h0PSI0Ni4yMzciLz4KICA8cmVjdCB4PSIyMzcuNTMiIHk9IjExLjIzIiB3aWR0aD0iNTIuNTE2IiBoZWlnaHQ9IjQ2LjIzNyIvPgogPC9nPgogPGc+CiAgPHJlY3QgeD0iMTMyLjQ5IiB5PSIxMS4yMyIgd2lkdGg9IjE3LjUwNSIgaGVpZ2h0PSIyNy40NjEiLz4KICA8cmVjdCB4PSIxNTAiIHk9IjI5LjMwMiIgd2lkdGg9IjguNzUyNyIgaGVpZ2h0PSIxOC43NzYiLz4KICA8cmVjdCB4PSIxNzYuMjYiIHk9IjI5LjMwMiIgd2lkdGg9IjguNzUyNyIgaGVpZ2h0PSIxOC43NzYiLz4KIDwvZz4KIDxyZWN0IHg9IjE1MCIgeT0iMTEuMjMiIHdpZHRoPSIxNy41MDUiIGhlaWdodD0iOC42ODQ1IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KIDxyZWN0IHg9IjE2Ny41MSIgeT0iMTEuMjMiIHdpZHRoPSIxNy41MDUiIGhlaWdodD0iOC42ODQ1IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KIDxnPgogIDxwYXRoIGQ9Im0yMzcuNTMgMzguNjkxLTE3LjUwNS05LjM4ODIgMTcuNTA1LTE4LjA3M3oiLz4KICA8cmVjdCB4PSIyMDIuODgiIHk9IjQ4LjA3OSIgd2lkdGg9IjE2Ljc3MiIgaGVpZ2h0PSI5LjM4ODIiLz4KICA8cmVjdCB4PSIyNzIuNTQiIHk9IjIwLjI2NiIgd2lkdGg9IjE2Ljc3MiIgaGVpZ2h0PSI5LjM4ODIiLz4KICA8cmVjdCB4PSIyNzIuNTQiIHk9IjM4LjY5MSIgd2lkdGg9IjE2Ljc3MiIgaGVpZ2h0PSI5LjM4ODIiLz4KICA8cGF0aCBkPSJtMjAyLjUyIDI5LjMwMiAwLjM2Njg1LTE4LjA3M2gxNy4xMzl6Ii8+CiA8L2c+CiA8cGF0aCBkPSJtNjQuMDc4IDEuMDA0Mi0zMy4zNzUgMzMuMzc1LTAuMDE3NDMgMC4wMTc0YTIzLjYxMiAyMy42MTIgMCAwIDAgMCAzMy4zOTIgMjMuNjEyIDIzLjYxMiAwIDAgMCAzMC4wMTIgMi44MDIyIDIzLjYxMiAyMy42MTIgMCAwIDEgN2UtMyAwLjU3MDM0IDIzLjYxMiAyMy42MTIgMCAwIDEtMjMuNjEyIDIzLjYxMmg1My45N2EyMy42MTIgMjMuNjEyIDAgMCAxLTIzLjYxMS0yMy42MTIgMjMuNjEyIDIzLjYxMiAwIDAgMSA3ZS0zIC0wLjU3MDM0IDIzLjYxMiAyMy42MTIgMCAwIDAgMzAuMDEyLTIuODAyOSAyMy42MTIgMjMuNjEyIDAgMCAwLTYuODhlLTQgLTMzLjM5MnoiIGZpbGw9IiM4MGMzZTQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgogPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utd2lkdGg9Ii41Ij4KICA8Y2lyY2xlIHRyYW5zZm9ybT0icm90YXRlKDEzNSkiIGN4PSItMjAuOTg4IiBjeT0iLTkzLjI0MyIgcj0iMjMuNjEyIi8+CiAgPGNpcmNsZSB0cmFuc2Zvcm09InJvdGF0ZSgxMzUpIiBjeD0iMi42MjM4IiBjeT0iLTY5LjYzMiIgcj0iMjMuNjEyIi8+CiAgPGNpcmNsZSBjeD0iOTEuMDYyIiBjeT0iNzEuMTYxIiByPSIyMy42MTIiLz4KICA8Y2lyY2xlIGN4PSIzNy4wOTMiIGN5PSI3MS4xNjEiIHI9IjIzLjYxMiIvPgogPC9nPgo8L3N2Zz4K';
5
+ const LOGO_WIDTH_RATIO = 0.5; // Logo takes up 50% of canvas width
6
+ function defaultDraw(g, canvas, logo) {
7
+ const size = [canvas.width, canvas.height];
8
+ const center = Vec2.mul(size, 0.5);
9
+ const bottomY = size[1] * 0.85;
10
+ if (logo.isReady()) {
11
+ const imgSize = logo.size;
12
+ // Scale to fit 50% of canvas width, ignoring height constraint
13
+ const scale = (size[0] * LOGO_WIDTH_RATIO) / imgSize[0];
14
+ const drawSize = Vec2.mul(imgSize, scale);
15
+ const rect = Rect.fromCenter(center, drawSize);
16
+ g.draw(logo, Rect.position(rect), { scale: [scale, scale] });
17
+ }
18
+ g.print('white', 'Click to Start', [0, bottomY], {
19
+ align: 'center',
20
+ limit: size[0],
21
+ font: '32px sans-serif'
22
+ });
3
23
  }
4
24
  export class StartupScene {
5
- constructor(graphics, config, onStart) {
25
+ constructor(graphics, config, setScene) {
6
26
  Object.defineProperty(this, "graphics", {
7
27
  enumerable: true,
8
28
  configurable: true,
@@ -15,11 +35,11 @@ export class StartupScene {
15
35
  writable: true,
16
36
  value: config
17
37
  });
18
- Object.defineProperty(this, "onStart", {
38
+ Object.defineProperty(this, "setScene", {
19
39
  enumerable: true,
20
40
  configurable: true,
21
41
  writable: true,
22
- value: onStart
42
+ value: setScene
23
43
  });
24
44
  Object.defineProperty(this, "started", {
25
45
  enumerable: true,
@@ -27,15 +47,22 @@ export class StartupScene {
27
47
  writable: true,
28
48
  value: false
29
49
  });
50
+ Object.defineProperty(this, "logo", {
51
+ enumerable: true,
52
+ configurable: true,
53
+ writable: true,
54
+ value: void 0
55
+ });
30
56
  this.graphics.setBackgroundColor('black');
57
+ this.logo = config.logo ?? graphics.newImage(LOGO_DATA_URI);
31
58
  }
32
59
  draw(canvas) {
33
- (this.config.draw ?? defaultDraw)(this.graphics, canvas);
60
+ (this.config.draw ?? defaultDraw)(this.graphics, canvas, this.logo);
34
61
  }
35
- handleEvent(event) {
36
- if (event.type === 'mousepressed' && !this.started) {
62
+ mousepressed(_x, _y, _button) {
63
+ if (!this.started) {
37
64
  this.started = true;
38
- this.onStart();
65
+ this.setScene(this.config.nextScene);
39
66
  }
40
67
  }
41
68
  }
@@ -1,11 +1,11 @@
1
1
  import type { Vector2 } from './vector2';
2
- export type CanvasMode = 'fixed' | 'native';
3
- export type CanvasConfig = {
4
- mode: 'fixed';
5
- size: Vector2;
6
- pixelArt?: boolean;
7
- } | {
8
- mode: 'native';
2
+ export type CanvasMode = {
3
+ pixelResolution: Vector2 | null;
4
+ fullscreen: boolean;
5
+ };
6
+ export type PartialCanvasMode = {
7
+ pixelResolution?: Vector2 | null;
8
+ fullscreen?: boolean;
9
9
  };
10
10
  /**
11
11
  * Calculate the scale and offset for rendering fixed-size content to a target canvas.
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-config.d.ts","sourceRoot":"","sources":["../../src/core/canvas-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAKzG"}
1
+ {"version":3,"file":"canvas-config.d.ts","sourceRoot":"","sources":["../../src/core/canvas-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG;IACvB,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,eAAe,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAKzG"}
@@ -1,4 +1,4 @@
1
- import type { CanvasConfig } from './canvas-config';
1
+ import type { CanvasMode, PartialCanvasMode } from './canvas-config';
2
2
  import { type Vector2 } from './vector2';
3
3
  export declare class CanvasManager {
4
4
  private canvas;
@@ -6,17 +6,16 @@ export declare class CanvasManager {
6
6
  private ctx;
7
7
  private config;
8
8
  private resizeObserver;
9
- private pixelArtCanvas;
10
- private pixelArtCtx;
9
+ private pixelCanvas;
10
+ private pixelCtx;
11
11
  private onWindowResize;
12
- private onFullscreenChange;
13
12
  onResize: ((size: Vector2, pixelSize: Vector2, fullscreen: boolean) => void) | null;
14
- constructor(canvas: HTMLCanvasElement, container: HTMLElement, ctx: CanvasRenderingContext2D, config?: CanvasConfig);
13
+ constructor(canvas: HTMLCanvasElement, container: HTMLElement, ctx: CanvasRenderingContext2D, config?: CanvasMode);
15
14
  private listenForPixelRatioChanges;
16
- setConfig(config: CanvasConfig): void;
17
- getConfig(): CanvasConfig;
15
+ setMode(mode: PartialCanvasMode): void;
16
+ getMode(): CanvasMode;
18
17
  private applyConfig;
19
- private applyFixedMode;
18
+ private applyPixelMode;
20
19
  private applyNativeMode;
21
20
  dispose(): void;
22
21
  present(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-manager.d.ts","sourceRoot":"","sources":["../../src/core/canvas-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAQ,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAmB/C,qBAAa,aAAa;IAWtB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,MAAM;IAbhB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,WAAW,CAAyC;IAE5D,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,kBAAkB,CAA4B;IAE/C,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;gBAGxF,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,WAAW,EACtB,GAAG,EAAE,wBAAwB,EAC7B,MAAM,GAAE,YAAiC;IAYnD,OAAO,CAAC,0BAA0B;IAQlC,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAKrC,SAAS,IAAI,YAAY;IAIzB,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,eAAe;IAkBvB,OAAO,IAAI,IAAI;IASf,OAAO,IAAI,IAAI;IAaf,gBAAgB,IAAI,iBAAiB;IAIrC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;CAiB5D"}
1
+ {"version":3,"file":"canvas-manager.d.ts","sourceRoot":"","sources":["../../src/core/canvas-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAQ,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAmB/C,qBAAa,aAAa;IAUtB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,MAAM;IAZhB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,QAAQ,CAAyC;IAEzD,OAAO,CAAC,cAAc,CAA4B;IAE3C,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;gBAGxF,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,WAAW,EACtB,GAAG,EAAE,wBAAwB,EAC7B,MAAM,GAAE,UAAyD;IAW3E,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAKtC,OAAO,IAAI,UAAU;IAIrB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,eAAe;IAkBvB,OAAO,IAAI,IAAI;IAQf,OAAO,IAAI,IAAI;IAaf,gBAAgB,IAAI,iBAAiB;IAIrC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;CAiB5D"}
@@ -14,7 +14,7 @@ function centerElement(el) {
14
14
  el.style.transform = 'translate(-50%, -50%)';
15
15
  }
16
16
  export class CanvasManager {
17
- constructor(canvas, container, ctx, config = { mode: 'native' }) {
17
+ constructor(canvas, container, ctx, config = { pixelResolution: null, fullscreen: false }) {
18
18
  Object.defineProperty(this, "canvas", {
19
19
  enumerable: true,
20
20
  configurable: true,
@@ -45,13 +45,13 @@ export class CanvasManager {
45
45
  writable: true,
46
46
  value: null
47
47
  });
48
- Object.defineProperty(this, "pixelArtCanvas", {
48
+ Object.defineProperty(this, "pixelCanvas", {
49
49
  enumerable: true,
50
50
  configurable: true,
51
51
  writable: true,
52
52
  value: null
53
53
  });
54
- Object.defineProperty(this, "pixelArtCtx", {
54
+ Object.defineProperty(this, "pixelCtx", {
55
55
  enumerable: true,
56
56
  configurable: true,
57
57
  writable: true,
@@ -63,12 +63,6 @@ export class CanvasManager {
63
63
  writable: true,
64
64
  value: () => this.applyConfig()
65
65
  });
66
- Object.defineProperty(this, "onFullscreenChange", {
67
- enumerable: true,
68
- configurable: true,
69
- writable: true,
70
- value: () => this.applyConfig()
71
- });
72
66
  Object.defineProperty(this, "onResize", {
73
67
  enumerable: true,
74
68
  configurable: true,
@@ -78,7 +72,6 @@ export class CanvasManager {
78
72
  this.resizeObserver = new ResizeObserver(() => this.applyConfig());
79
73
  this.resizeObserver.observe(this.container);
80
74
  window.addEventListener('resize', this.onWindowResize);
81
- document.addEventListener('fullscreenchange', this.onFullscreenChange);
82
75
  this.listenForPixelRatioChanges();
83
76
  this.applyConfig();
84
77
  }
@@ -89,63 +82,50 @@ export class CanvasManager {
89
82
  this.listenForPixelRatioChanges();
90
83
  }, { once: true });
91
84
  }
92
- setConfig(config) {
93
- this.config = config;
85
+ setMode(mode) {
86
+ this.config = { ...this.config, ...mode };
94
87
  this.applyConfig();
95
88
  }
96
- getConfig() {
89
+ getMode() {
97
90
  return { ...this.config };
98
91
  }
99
92
  applyConfig() {
100
93
  const containerSize = document.fullscreenElement
101
94
  ? [document.fullscreenElement.clientWidth, document.fullscreenElement.clientHeight]
102
95
  : [this.container.clientWidth, this.container.clientHeight];
103
- // Always clean up pixel art canvas first
104
- if (this.pixelArtCanvas) {
105
- this.pixelArtCanvas.remove();
106
- this.pixelArtCanvas = null;
107
- this.pixelArtCtx = null;
96
+ // Always clean up pixel canvas first
97
+ if (this.pixelCanvas) {
98
+ this.pixelCanvas.remove();
99
+ this.pixelCanvas = null;
100
+ this.pixelCtx = null;
101
+ }
102
+ if (this.config.pixelResolution) {
103
+ this.applyPixelMode(containerSize);
108
104
  }
109
- switch (this.config.mode) {
110
- case 'fixed':
111
- this.applyFixedMode(containerSize);
112
- break;
113
- case 'native':
114
- this.applyNativeMode(containerSize);
115
- break;
105
+ else {
106
+ this.applyNativeMode(containerSize);
116
107
  }
117
- const displayCanvas = this.pixelArtCanvas ?? this.canvas;
118
- const isFullscreen = !!document.fullscreenElement;
119
- this.onResize?.(containerSize, [displayCanvas.width, displayCanvas.height], isFullscreen);
108
+ const displayCanvas = this.pixelCanvas ?? this.canvas;
109
+ this.onResize?.(containerSize, [displayCanvas.width, displayCanvas.height], this.config.fullscreen);
120
110
  }
121
- applyFixedMode(csize) {
122
- const { size: gameSize, pixelArt } = this.config;
111
+ applyPixelMode(csize) {
112
+ const gameSize = this.config.pixelResolution;
123
113
  const pixelRatio = window.devicePixelRatio || 1;
124
114
  const scale = Math.min(csize[0] / gameSize[0], csize[1] / gameSize[1]);
125
- if (pixelArt) {
126
- const physicalScale = scale * pixelRatio;
127
- const intScale = Math.max(1, Math.floor(physicalScale));
128
- this.pixelArtCanvas = document.createElement('canvas');
129
- this.pixelArtCtx = this.pixelArtCanvas.getContext('2d');
130
- setCanvasSize(this.pixelArtCanvas, Vec2.mul(gameSize, intScale));
131
- setCanvasSize(this.canvas, gameSize);
132
- this.canvas.style.display = 'none';
133
- const pac = this.pixelArtCanvas;
134
- setCanvasDisplaySize(pac, Vec2.mul(gameSize, scale));
135
- pac.style.maxWidth = '100%';
136
- pac.style.maxHeight = '100%';
137
- pac.style.imageRendering = 'auto';
138
- centerElement(pac);
139
- this.container.appendChild(pac);
140
- }
141
- else {
142
- setCanvasSize(this.canvas, gameSize);
143
- this.canvas.style.display = 'block';
144
- setCanvasDisplaySize(this.canvas, Vec2.mul(gameSize, scale));
145
- this.canvas.style.imageRendering = pixelArt ? 'pixelated' : 'auto';
146
- this.ctx.imageSmoothingEnabled = !pixelArt;
147
- centerElement(this.canvas);
148
- }
115
+ const physicalScale = scale * pixelRatio;
116
+ const intScale = Math.max(1, Math.floor(physicalScale));
117
+ this.pixelCanvas = document.createElement('canvas');
118
+ this.pixelCtx = this.pixelCanvas.getContext('2d');
119
+ setCanvasSize(this.pixelCanvas, Vec2.mul(gameSize, intScale));
120
+ setCanvasSize(this.canvas, gameSize);
121
+ this.canvas.style.display = 'none';
122
+ const pc = this.pixelCanvas;
123
+ setCanvasDisplaySize(pc, Vec2.mul(gameSize, scale));
124
+ pc.style.maxWidth = '100%';
125
+ pc.style.maxHeight = '100%';
126
+ pc.style.imageRendering = 'auto';
127
+ centerElement(pc);
128
+ this.container.appendChild(pc);
149
129
  }
150
130
  applyNativeMode(csize) {
151
131
  const pixelRatio = window.devicePixelRatio || 1;
@@ -164,34 +144,35 @@ export class CanvasManager {
164
144
  dispose() {
165
145
  this.resizeObserver?.disconnect();
166
146
  window.removeEventListener('resize', this.onWindowResize);
167
- document.removeEventListener('fullscreenchange', this.onFullscreenChange);
168
- this.pixelArtCanvas?.remove();
169
- this.pixelArtCanvas = null;
170
- this.pixelArtCtx = null;
147
+ this.pixelCanvas?.remove();
148
+ this.pixelCanvas = null;
149
+ this.pixelCtx = null;
171
150
  }
172
151
  present() {
173
- if (!this.pixelArtCtx || !this.pixelArtCanvas) {
152
+ if (!this.pixelCtx || !this.pixelCanvas) {
174
153
  return;
175
154
  }
176
- this.pixelArtCtx.imageSmoothingEnabled = false;
177
- this.pixelArtCtx.drawImage(this.canvas, 0, 0, this.canvas.width, this.canvas.height, 0, 0, this.pixelArtCanvas.width, this.pixelArtCanvas.height);
155
+ this.pixelCtx.imageSmoothingEnabled = false;
156
+ this.pixelCtx.drawImage(this.canvas, 0, 0, this.canvas.width, this.canvas.height, 0, 0, this.pixelCanvas.width, this.pixelCanvas.height);
178
157
  }
179
158
  getDisplayCanvas() {
180
- return this.pixelArtCanvas ?? this.canvas;
159
+ return this.pixelCanvas ?? this.canvas;
181
160
  }
182
161
  transformMousePosition(cssX, cssY) {
183
162
  const displayCanvas = this.getDisplayCanvas();
184
163
  const rect = displayCanvas.getBoundingClientRect();
185
164
  const relative = [cssX - rect.left, cssY - rect.top];
186
- switch (this.config.mode) {
187
- case 'fixed': {
188
- const scale = [displayCanvas.width / rect.width, displayCanvas.height / rect.height];
189
- return Vec2.mul(relative, scale);
190
- }
191
- case 'native':
192
- default: {
193
- return Vec2.mul(relative, window.devicePixelRatio || 1);
194
- }
165
+ if (this.config.pixelResolution) {
166
+ // In pixel mode: CSS position (as fraction of CSS size) × game size = game position
167
+ const gameSize = this.config.pixelResolution;
168
+ return Vec2.mul(relative, [gameSize[0] / rect.width, gameSize[1] / rect.height]);
169
+ }
170
+ else {
171
+ // In native mode, canvas fills the container completely at position 0,0
172
+ // Mouse coordinates should be relative to the canvas, accounting for the fact
173
+ // that the canvas internal pixel size != CSS size
174
+ const pixelRatio = window.devicePixelRatio || 1;
175
+ return Vec2.mul(relative, pixelRatio);
195
176
  }
196
177
  }
197
178
  }
package/dist/engine.d.ts CHANGED
@@ -6,7 +6,7 @@ import type { Keyboard } from './core/keyboard';
6
6
  import type { Mouse } from './core/mouse';
7
7
  import type { Gamepad } from './core/gamepad';
8
8
  import type { Like2DEvent } from './core/events';
9
- import type { CanvasConfig } from './core/canvas-config';
9
+ import type { CanvasMode, PartialCanvasMode } from './core/canvas-config';
10
10
  export type EngineDeps = {
11
11
  graphics: Graphics;
12
12
  input: Input;
@@ -26,7 +26,9 @@ export declare class Engine {
26
26
  private canvasManager;
27
27
  private onEvent;
28
28
  constructor(container: HTMLElement);
29
- setScaling(config: CanvasConfig): void;
29
+ private handleFullscreenChange;
30
+ setMode(mode: PartialCanvasMode): void;
31
+ getMode(): CanvasMode;
30
32
  setDeps(deps: EngineDeps): void;
31
33
  dispose(): void;
32
34
  private dispatchEvent;
@@ -37,6 +39,5 @@ export declare class Engine {
37
39
  getCanvas(): HTMLCanvasElement;
38
40
  getContext(): CanvasRenderingContext2D;
39
41
  transformMousePosition(cssX: number, cssY: number): [number, number];
40
- toggleFullscreen(): void;
41
42
  }
42
43
  //# sourceMappingURL=engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAA+C;gBAElD,SAAS,EAAE,WAAW;IAmBlC,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAItC,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI/B,OAAO,IAAI,IAAI;IAWf,OAAO,CAAC,aAAa;IAMrB,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI;IA+C3C,IAAI;IAIJ,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAKrC,OAAO,IAAI,MAAM;IAIjB,SAAS,IAAI,iBAAiB;IAI9B,UAAU,IAAI,wBAAwB;IAItC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIpE,gBAAgB,IAAI,IAAI;CAOzB"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG1E,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,GAAG,CAA2B;IACtC,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,OAAO,CAA+C;gBAElD,SAAS,EAAE,WAAW;IAsBlC,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAgBtC,OAAO,IAAI,UAAU;IAIrB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI/B,OAAO,IAAI,IAAI;IAWf,OAAO,CAAC,aAAa;IAMrB,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI;IA+C3C,IAAI;IAIJ,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAKrC,OAAO,IAAI,MAAM;IAIjB,SAAS,IAAI,iBAAiB;IAI9B,UAAU,IAAI,wBAAwB;IAItC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;CAIrE"}
package/dist/engine.js CHANGED
@@ -58,14 +58,37 @@ export class Engine {
58
58
  this.ctx = ctx;
59
59
  this.container = container;
60
60
  this.container.appendChild(this.canvas);
61
- this.canvasManager = new CanvasManager(this.canvas, this.container, this.ctx, { mode: 'native' });
61
+ this.canvasManager = new CanvasManager(this.canvas, this.container, this.ctx, { pixelResolution: null, fullscreen: false });
62
62
  // Internal listener to forward to onEvent
63
63
  this.canvasManager.onResize = (size, pixelSize, fullscreen) => {
64
64
  this.dispatchEvent('resize', [size, pixelSize, fullscreen]);
65
65
  };
66
+ // Listen for fullscreen changes to update mode
67
+ document.addEventListener('fullscreenchange', () => this.handleFullscreenChange());
66
68
  }
67
- setScaling(config) {
68
- this.canvasManager.setConfig(config);
69
+ handleFullscreenChange() {
70
+ const mode = this.canvasManager.getMode();
71
+ const isFullscreen = !!document.fullscreenElement;
72
+ if (mode.fullscreen !== isFullscreen) {
73
+ this.canvasManager.setMode({ ...mode, fullscreen: isFullscreen });
74
+ }
75
+ }
76
+ setMode(mode) {
77
+ const currentMode = this.canvasManager.getMode();
78
+ const mergedMode = { ...currentMode, ...mode };
79
+ const needsFullscreenChange = mode.fullscreen !== undefined && mode.fullscreen !== currentMode.fullscreen;
80
+ if (needsFullscreenChange) {
81
+ if (mergedMode.fullscreen) {
82
+ this.container.requestFullscreen().catch(console.error);
83
+ }
84
+ else {
85
+ document.exitFullscreen();
86
+ }
87
+ }
88
+ this.canvasManager.setMode(mode);
89
+ }
90
+ getMode() {
91
+ return this.canvasManager.getMode();
69
92
  }
70
93
  setDeps(deps) {
71
94
  this.deps = deps;
@@ -143,12 +166,4 @@ export class Engine {
143
166
  transformMousePosition(cssX, cssY) {
144
167
  return this.canvasManager.transformMousePosition(cssX, cssY);
145
168
  }
146
- toggleFullscreen() {
147
- if (!document.fullscreenElement) {
148
- this.container.requestFullscreen().catch(console.error);
149
- }
150
- else {
151
- document.exitFullscreen();
152
- }
153
- }
154
169
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "like2d",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "description": "A web-native game framework inspired by Love2D",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",