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.
- package/dist/adapters/callback/index.d.ts +4 -3
- package/dist/adapters/callback/index.d.ts.map +1 -1
- package/dist/adapters/callback/index.js +4 -4
- package/dist/adapters/scene/index.d.ts +4 -3
- package/dist/adapters/scene/index.d.ts.map +1 -1
- package/dist/adapters/scene/index.js +5 -2
- package/dist/adapters/scene/startup-scene.d.ts +6 -4
- package/dist/adapters/scene/startup-scene.d.ts.map +1 -1
- package/dist/adapters/scene/startup-scene.js +36 -9
- package/dist/core/canvas-config.d.ts +7 -7
- package/dist/core/canvas-config.d.ts.map +1 -1
- package/dist/core/canvas-manager.d.ts +7 -8
- package/dist/core/canvas-manager.d.ts.map +1 -1
- package/dist/core/canvas-manager.js +52 -71
- package/dist/engine.d.ts +4 -3
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +26 -11
- package/package.json +1 -1
|
@@ -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 {
|
|
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
|
-
|
|
38
|
-
|
|
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,
|
|
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
|
-
|
|
37
|
-
engine?.
|
|
36
|
+
setMode(mode) {
|
|
37
|
+
engine?.setMode(mode);
|
|
38
38
|
},
|
|
39
|
-
|
|
40
|
-
engine?.
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
87
|
-
this.engine.
|
|
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
|
|
12
|
+
private setScene;
|
|
12
13
|
private started;
|
|
13
|
-
|
|
14
|
+
private logo;
|
|
15
|
+
constructor(graphics: Graphics, config: StartupSceneConfig, setScene: (scene: Scene) => void);
|
|
14
16
|
draw(canvas: HTMLCanvasElement): void;
|
|
15
|
-
|
|
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,
|
|
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
|
-
|
|
2
|
-
|
|
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,
|
|
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, "
|
|
38
|
+
Object.defineProperty(this, "setScene", {
|
|
19
39
|
enumerable: true,
|
|
20
40
|
configurable: true,
|
|
21
41
|
writable: true,
|
|
22
|
-
value:
|
|
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
|
-
|
|
36
|
-
if (
|
|
62
|
+
mousepressed(_x, _y, _button) {
|
|
63
|
+
if (!this.started) {
|
|
37
64
|
this.started = true;
|
|
38
|
-
this.
|
|
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 =
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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,
|
|
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 {
|
|
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
|
|
10
|
-
private
|
|
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?:
|
|
13
|
+
constructor(canvas: HTMLCanvasElement, container: HTMLElement, ctx: CanvasRenderingContext2D, config?: CanvasMode);
|
|
15
14
|
private listenForPixelRatioChanges;
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
setMode(mode: PartialCanvasMode): void;
|
|
16
|
+
getMode(): CanvasMode;
|
|
18
17
|
private applyConfig;
|
|
19
|
-
private
|
|
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,
|
|
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 = {
|
|
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, "
|
|
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, "
|
|
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
|
-
|
|
93
|
-
this.config = config;
|
|
85
|
+
setMode(mode) {
|
|
86
|
+
this.config = { ...this.config, ...mode };
|
|
94
87
|
this.applyConfig();
|
|
95
88
|
}
|
|
96
|
-
|
|
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
|
|
104
|
-
if (this.
|
|
105
|
-
this.
|
|
106
|
-
this.
|
|
107
|
-
this.
|
|
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
|
-
|
|
110
|
-
|
|
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.
|
|
118
|
-
|
|
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
|
-
|
|
122
|
-
const
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
168
|
-
this.
|
|
169
|
-
this.
|
|
170
|
-
this.pixelArtCtx = null;
|
|
147
|
+
this.pixelCanvas?.remove();
|
|
148
|
+
this.pixelCanvas = null;
|
|
149
|
+
this.pixelCtx = null;
|
|
171
150
|
}
|
|
172
151
|
present() {
|
|
173
|
-
if (!this.
|
|
152
|
+
if (!this.pixelCtx || !this.pixelCanvas) {
|
|
174
153
|
return;
|
|
175
154
|
}
|
|
176
|
-
this.
|
|
177
|
-
this.
|
|
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.
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -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,
|
|
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, {
|
|
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
|
-
|
|
68
|
-
this.canvasManager.
|
|
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
|
}
|