kiwiengine 0.0.1-alpha

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 (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -0
  3. package/assets/logo.png +0 -0
  4. package/examples/package.json +13 -0
  5. package/examples/test-dom/index.html +24 -0
  6. package/examples/test-dom/index.ts +21 -0
  7. package/examples/tsconfig.json +22 -0
  8. package/examples/webpack.config.js +31 -0
  9. package/lib/asset/audio.js +158 -0
  10. package/lib/asset/audio.js.map +1 -0
  11. package/lib/asset/loaders/audio.js +35 -0
  12. package/lib/asset/loaders/audio.js.map +1 -0
  13. package/lib/asset/loaders/binary.js +28 -0
  14. package/lib/asset/loaders/binary.js.map +1 -0
  15. package/lib/asset/loaders/font.js +27 -0
  16. package/lib/asset/loaders/font.js.map +1 -0
  17. package/lib/asset/loaders/loader.js +37 -0
  18. package/lib/asset/loaders/loader.js.map +1 -0
  19. package/lib/asset/loaders/spritesheet.js +56 -0
  20. package/lib/asset/loaders/spritesheet.js.map +1 -0
  21. package/lib/asset/loaders/text.js +27 -0
  22. package/lib/asset/loaders/text.js.map +1 -0
  23. package/lib/asset/loaders/texture.js +38 -0
  24. package/lib/asset/loaders/texture.js.map +1 -0
  25. package/lib/asset/preload.js +69 -0
  26. package/lib/asset/preload.js.map +1 -0
  27. package/lib/game-object/game-object-physics.js +188 -0
  28. package/lib/game-object/game-object-physics.js.map +1 -0
  29. package/lib/game-object/game-object-rendering.js +35 -0
  30. package/lib/game-object/game-object-rendering.js.map +1 -0
  31. package/lib/game-object/game-object.js +162 -0
  32. package/lib/game-object/game-object.js.map +1 -0
  33. package/lib/game-object/transform.js +118 -0
  34. package/lib/game-object/transform.js.map +1 -0
  35. package/lib/game-object-ext/animated-sprite.js +117 -0
  36. package/lib/game-object-ext/animated-sprite.js.map +1 -0
  37. package/lib/game-object-ext/dom-container.js +56 -0
  38. package/lib/game-object-ext/dom-container.js.map +1 -0
  39. package/lib/game-object-ext/rect.js +30 -0
  40. package/lib/game-object-ext/rect.js.map +1 -0
  41. package/lib/game-object-ext/spine.js +206 -0
  42. package/lib/game-object-ext/spine.js.map +1 -0
  43. package/lib/game-object-ext/sprite.js +46 -0
  44. package/lib/game-object-ext/sprite.js.map +1 -0
  45. package/lib/game-object-ext/text.js +68 -0
  46. package/lib/game-object-ext/text.js.map +1 -0
  47. package/lib/game-object-ext/tiling-sprite.js +64 -0
  48. package/lib/game-object-ext/tiling-sprite.js.map +1 -0
  49. package/lib/index.js +13 -0
  50. package/lib/index.js.map +1 -0
  51. package/lib/types/asset/audio.d.ts +21 -0
  52. package/lib/types/asset/audio.d.ts.map +1 -0
  53. package/lib/types/asset/loaders/audio.d.ts +7 -0
  54. package/lib/types/asset/loaders/audio.d.ts.map +1 -0
  55. package/lib/types/asset/loaders/binary.d.ts +7 -0
  56. package/lib/types/asset/loaders/binary.d.ts.map +1 -0
  57. package/lib/types/asset/loaders/font.d.ts +7 -0
  58. package/lib/types/asset/loaders/font.d.ts.map +1 -0
  59. package/lib/types/asset/loaders/loader.d.ts +13 -0
  60. package/lib/types/asset/loaders/loader.d.ts.map +1 -0
  61. package/lib/types/asset/loaders/spritesheet.d.ts +11 -0
  62. package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -0
  63. package/lib/types/asset/loaders/text.d.ts +7 -0
  64. package/lib/types/asset/loaders/text.d.ts.map +1 -0
  65. package/lib/types/asset/loaders/texture.d.ts +9 -0
  66. package/lib/types/asset/loaders/texture.d.ts.map +1 -0
  67. package/lib/types/asset/preload.d.ts +8 -0
  68. package/lib/types/asset/preload.d.ts.map +1 -0
  69. package/lib/types/game-object/game-object-physics.d.ts +42 -0
  70. package/lib/types/game-object/game-object-physics.d.ts.map +1 -0
  71. package/lib/types/game-object/game-object-rendering.d.ts +15 -0
  72. package/lib/types/game-object/game-object-rendering.d.ts.map +1 -0
  73. package/lib/types/game-object/game-object.d.ts +81 -0
  74. package/lib/types/game-object/game-object.d.ts.map +1 -0
  75. package/lib/types/game-object/transform.d.ts +43 -0
  76. package/lib/types/game-object/transform.d.ts.map +1 -0
  77. package/lib/types/game-object-ext/animated-sprite.d.ts +29 -0
  78. package/lib/types/game-object-ext/animated-sprite.d.ts.map +1 -0
  79. package/lib/types/game-object-ext/dom-container.d.ts +16 -0
  80. package/lib/types/game-object-ext/dom-container.d.ts.map +1 -0
  81. package/lib/types/game-object-ext/rect.d.ts +17 -0
  82. package/lib/types/game-object-ext/rect.d.ts.map +1 -0
  83. package/lib/types/game-object-ext/spine.d.ts +35 -0
  84. package/lib/types/game-object-ext/spine.d.ts.map +1 -0
  85. package/lib/types/game-object-ext/sprite.d.ts +14 -0
  86. package/lib/types/game-object-ext/sprite.d.ts.map +1 -0
  87. package/lib/types/game-object-ext/text.d.ts +26 -0
  88. package/lib/types/game-object-ext/text.d.ts.map +1 -0
  89. package/lib/types/game-object-ext/tiling-sprite.d.ts +20 -0
  90. package/lib/types/game-object-ext/tiling-sprite.d.ts.map +1 -0
  91. package/lib/types/index.d.ts +14 -0
  92. package/lib/types/index.d.ts.map +1 -0
  93. package/lib/types/utils/debug.d.ts +3 -0
  94. package/lib/types/utils/debug.d.ts.map +1 -0
  95. package/lib/types/utils/go.d.ts +26 -0
  96. package/lib/types/utils/go.d.ts.map +1 -0
  97. package/lib/types/world/world-debug.d.ts +11 -0
  98. package/lib/types/world/world-debug.d.ts.map +1 -0
  99. package/lib/types/world/world-physics.d.ts +16 -0
  100. package/lib/types/world/world-physics.d.ts.map +1 -0
  101. package/lib/types/world/world-rendering.d.ts +28 -0
  102. package/lib/types/world/world-rendering.d.ts.map +1 -0
  103. package/lib/types/world/world.d.ts +38 -0
  104. package/lib/types/world/world.d.ts.map +1 -0
  105. package/lib/utils/debug.js +5 -0
  106. package/lib/utils/debug.js.map +1 -0
  107. package/lib/utils/go.js +33 -0
  108. package/lib/utils/go.js.map +1 -0
  109. package/lib/world/world-debug.js +89 -0
  110. package/lib/world/world-debug.js.map +1 -0
  111. package/lib/world/world-physics.js +45 -0
  112. package/lib/world/world-physics.js.map +1 -0
  113. package/lib/world/world-rendering.js +123 -0
  114. package/lib/world/world-rendering.js.map +1 -0
  115. package/lib/world/world.js +147 -0
  116. package/lib/world/world.js.map +1 -0
  117. package/package.json +23 -0
  118. package/src/asset/audio.ts +176 -0
  119. package/src/asset/loaders/audio.ts +39 -0
  120. package/src/asset/loaders/binary.ts +32 -0
  121. package/src/asset/loaders/font.ts +27 -0
  122. package/src/asset/loaders/loader.ts +39 -0
  123. package/src/asset/loaders/spritesheet.ts +67 -0
  124. package/src/asset/loaders/text.ts +31 -0
  125. package/src/asset/loaders/texture.ts +46 -0
  126. package/src/asset/preload.ts +76 -0
  127. package/src/game-object/game-object-physics.ts +191 -0
  128. package/src/game-object/game-object-rendering.ts +27 -0
  129. package/src/game-object/game-object.ts +190 -0
  130. package/src/game-object/transform.ts +164 -0
  131. package/src/game-object-ext/animated-sprite.ts +140 -0
  132. package/src/game-object-ext/dom-container.ts +67 -0
  133. package/src/game-object-ext/rect.ts +40 -0
  134. package/src/game-object-ext/spine.ts +235 -0
  135. package/src/game-object-ext/sprite.ts +55 -0
  136. package/src/game-object-ext/text.ts +83 -0
  137. package/src/game-object-ext/tiling-sprite.ts +73 -0
  138. package/src/index.ts +14 -0
  139. package/src/utils/debug.ts +5 -0
  140. package/src/utils/go.ts +53 -0
  141. package/src/world/world-debug.ts +114 -0
  142. package/src/world/world-physics.ts +52 -0
  143. package/src/world/world-rendering.ts +145 -0
  144. package/src/world/world.ts +171 -0
  145. package/tsconfig.json +33 -0
@@ -0,0 +1,20 @@
1
+ import { EventMap } from '@webtaku/event-emitter';
2
+ import { GameObject, GameObjectOptions } from '../game-object/game-object';
3
+ import { WorldTransform } from '../game-object/transform';
4
+ type TilingSpriteOptions = {
5
+ src?: string;
6
+ scrollSpeedX?: number;
7
+ scrollSpeedY?: number;
8
+ } & GameObjectOptions;
9
+ declare class TilingSpriteObject<E extends EventMap = EventMap> extends GameObject<E> {
10
+ #private;
11
+ scrollSpeedX?: number;
12
+ scrollSpeedY?: number;
13
+ constructor(opts?: TilingSpriteOptions);
14
+ get src(): string | undefined;
15
+ set src(src: string | undefined);
16
+ _engineUpdate(dt: number, pt: WorldTransform): void;
17
+ remove(): void;
18
+ }
19
+ export { TilingSpriteObject };
20
+ //# sourceMappingURL=tiling-sprite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiling-sprite.d.ts","sourceRoot":"","sources":["../../../src/game-object-ext/tiling-sprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,KAAK,mBAAmB,GAAG;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,iBAAiB,CAAC;AAEtB,cAAM,kBAAkB,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;;IAI3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEV,IAAI,CAAC,EAAE,mBAAmB;IA2BtC,IAAI,GAAG,IAIM,MAAM,GAAG,SAAS,CAF9B;IAED,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAM9B;IAED,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc;IAQ5C,MAAM;CAIP;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ export { musicPlayer, sfxPlayer } from './asset/audio';
2
+ export { AssetSource, preload } from './asset/preload';
3
+ export { AnimatedSpriteObject } from './game-object-ext/animated-sprite';
4
+ export { DomContainerObject } from './game-object-ext/dom-container';
5
+ export { RectangleObject } from './game-object-ext/rect';
6
+ export { SpineObject } from './game-object-ext/spine';
7
+ export { SpriteObject } from './game-object-ext/sprite';
8
+ export { TextObject } from './game-object-ext/text';
9
+ export { GameObject, GameObjectOptions } from './game-object/game-object';
10
+ export { Collider } from './game-object/game-object-physics';
11
+ export { enableDebug } from './utils/debug';
12
+ export { go } from './utils/go';
13
+ export { World } from './world/world';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare let debugMode: boolean;
2
+ export declare function enableDebug(): void;
3
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../../src/utils/debug.ts"],"names":[],"mappings":"AAAA,eAAO,IAAI,SAAS,SAAQ,CAAC;AAE7B,wBAAgB,WAAW,SAE1B"}
@@ -0,0 +1,26 @@
1
+ import { AnimatedSpriteObject } from '../game-object-ext/animated-sprite';
2
+ import { DomContainerObject } from '../game-object-ext/dom-container';
3
+ import { RectangleObject } from '../game-object-ext/rect';
4
+ import { SpineObject } from '../game-object-ext/spine';
5
+ import { SpriteObject } from '../game-object-ext/sprite';
6
+ import { TextObject } from '../game-object-ext/text';
7
+ import { TilingSpriteObject } from '../game-object-ext/tiling-sprite';
8
+ import { GameObject } from '../game-object/game-object';
9
+ declare const GameObjectClassMap: {
10
+ readonly go: typeof GameObject;
11
+ readonly sprite: typeof SpriteObject;
12
+ readonly 'animated-sprite': typeof AnimatedSpriteObject;
13
+ readonly 'tiling-sprite': typeof TilingSpriteObject;
14
+ readonly spine: typeof SpineObject;
15
+ readonly dom: typeof DomContainerObject;
16
+ readonly text: typeof TextObject;
17
+ readonly rect: typeof RectangleObject;
18
+ };
19
+ type GameObjectNameMap = {
20
+ [K in keyof typeof GameObjectClassMap]: InstanceType<(typeof GameObjectClassMap)[K]>;
21
+ };
22
+ type Name = '' | keyof GameObjectNameMap;
23
+ type GameObjectByName<T extends Name> = (T extends '' ? GameObject : (T extends keyof GameObjectNameMap ? GameObjectNameMap[T] : GameObject));
24
+ declare function go<T extends Name>(name?: T, ...args: (GameObjectByName<T> | Partial<GameObjectByName<T>>)[]): GameObjectByName<T>;
25
+ export { go };
26
+ //# sourceMappingURL=go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../../src/utils/go.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,QAAA,MAAM,kBAAkB;;;;;;;;;CASd,CAAC;AAEX,KAAK,iBAAiB,GAAG;KACtB,CAAC,IAAI,MAAM,OAAO,kBAAkB,GAAG,YAAY,CAAC,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;CACrF,CAAC;AAEF,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,iBAAiB,CAAC;AAEzC,KAAK,gBAAgB,CAAC,CAAC,SAAS,IAAI,IAAI,CACtC,CAAC,SAAS,EAAE,GAAG,UAAU,GACvB,CACA,CAAC,SAAS,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,CAAC,CAAC,GACtD,UAAU,CACb,CACF,CAAC;AAEF,iBAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EACxB,IAAI,GAAE,CAAW,EACjB,GAAG,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAC9D,gBAAgB,CAAC,CAAC,CAAC,CAarB;AAED,OAAO,EAAE,EAAE,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import Matter from 'matter-js';
2
+ export declare class WorldDebug {
3
+ #private;
4
+ constructor(container: HTMLElement);
5
+ update(): void;
6
+ createMatterDebugRenderer(engine: Matter.Engine, width: number, height: number): void;
7
+ setMatterDebugRendererSize(rect: DOMRectReadOnly, width: number, height: number, cameraX: number, cameraY: number): void;
8
+ setMatterDebugRendererCamera(cameraX: number, cameraY: number): void;
9
+ destroy(): void;
10
+ }
11
+ //# sourceMappingURL=world-debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-debug.d.ts","sourceRoot":"","sources":["../../../src/world/world-debug.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,WAAW,CAAC;AAI/B,qBAAa,UAAU;;gBAKT,SAAS,EAAE,WAAW;IAYlC,MAAM;IAIN,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAgC9E,0BAA0B,CACxB,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM;IAmCjB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAe7D,OAAO;CACR"}
@@ -0,0 +1,16 @@
1
+ import { EventEmitter } from '@webtaku/event-emitter';
2
+ import Matter from 'matter-js';
3
+ import { GameObject } from '../game-object/game-object';
4
+ export declare class WorldPhysics extends EventEmitter<{
5
+ engineCreated: (engine: Matter.Engine) => void;
6
+ collisionStart: (a: GameObject, b: GameObject) => void;
7
+ }> {
8
+ #private;
9
+ get gravity(): number;
10
+ set gravity(v: number);
11
+ addBody(body: Matter.Body): void;
12
+ removeBody(body: Matter.Body): void;
13
+ update(dt: number): void;
14
+ destroy(): void;
15
+ }
16
+ //# sourceMappingURL=world-physics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-physics.d.ts","sourceRoot":"","sources":["../../../src/world/world-physics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,qBAAa,YAAa,SAAQ,YAAY,CAAC;IAC7C,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACxD,CAAC;;IAIA,IAAI,OAAO,IACI,MAAM,CADkB;IACvC,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,EAGpB;IAgBD,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI;IAKzB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI;IAK5B,MAAM,CAAC,EAAE,EAAE,MAAM;IAMjB,OAAO;CAIR"}
@@ -0,0 +1,28 @@
1
+ import { Container, EventEmitter } from "pixi.js";
2
+ export declare class WorldRendering extends EventEmitter<{
3
+ positionChanged: () => void;
4
+ }> {
5
+ #private;
6
+ centerX: number;
7
+ centerY: number;
8
+ renderWidth: number;
9
+ renderHeight: number;
10
+ renderScale: number;
11
+ canvasLeft: number;
12
+ canvasTop: number;
13
+ get backgroundColor(): number;
14
+ set backgroundColor(v: number);
15
+ get backgroundAlpha(): number;
16
+ set backgroundAlpha(v: number);
17
+ init(container: HTMLElement, width: number | undefined, height: number | undefined): Promise<void>;
18
+ setRendererSize(rect: DOMRect, width: number, height: number): void;
19
+ update(): void;
20
+ get cameraX(): number;
21
+ set cameraX(value: number);
22
+ get cameraY(): number;
23
+ set cameraY(value: number);
24
+ addPixiChildToRoot(child: Container): void;
25
+ destroy(): void;
26
+ setBackgroundImage(image: string | undefined): void;
27
+ }
28
+ //# sourceMappingURL=world-rendering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-rendering.d.ts","sourceRoot":"","sources":["../../../src/world/world-rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,SAAS,EAAE,YAAY,EAAoB,MAAM,SAAS,CAAC;AAGxF,qBAAa,cAAe,SAAQ,YAAY,CAAC;IAC/C,eAAe,EAAE,MAAM,IAAI,CAAC;CAC7B,CAAC;;IAQA,OAAO,SAAK;IACZ,OAAO,SAAK;IACZ,WAAW,SAAK;IAChB,YAAY,SAAK;IACjB,WAAW,SAAK;IAChB,UAAU,SAAK;IACf,SAAS,SAAK;IAGd,IAAI,eAAe,IACI,MAAM,CAD0B;IACvD,IAAI,eAAe,CAAC,CAAC,EAAE,MAAM,EAG5B;IAED,IAAI,eAAe,IACI,MAAM,CAD0B;IACvD,IAAI,eAAe,CAAC,CAAC,EAAE,MAAM,EAG5B;IAEK,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS;IAoCxF,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAiC5D,MAAM;IAIN,IAAI,OAAO,IACQ,MAAM,CADc;IACvC,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAmD;IAC5E,IAAI,OAAO,IACQ,MAAM,CADc;IACvC,IAAI,OAAO,CAAC,KAAK,EAAE,MAAM,EAAmD;IAE5E,kBAAkB,CAAC,KAAK,EAAE,SAAS;IAInC,OAAO;IAMP,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;CAsB7C"}
@@ -0,0 +1,38 @@
1
+ import { GameObject, GameObjectOptions } from '../game-object/game-object';
2
+ import { WorldPhysics } from "./world-physics";
3
+ import { WorldRendering } from "./world-rendering";
4
+ export type WorldOptions = {
5
+ width?: number;
6
+ height?: number;
7
+ backgroundColor?: number;
8
+ backgroundAlpha?: number;
9
+ gravity?: number;
10
+ } & GameObjectOptions;
11
+ export declare class World extends GameObject<{
12
+ resize: (width: number, height: number) => void;
13
+ collisionStart: (a: GameObject, b: GameObject) => void;
14
+ }> {
15
+ #private;
16
+ container: HTMLDivElement;
17
+ _worldRendering: WorldRendering;
18
+ _worldPhysics: WorldPhysics;
19
+ _containerSizeDirty: boolean;
20
+ constructor(opts?: WorldOptions);
21
+ get width(): number;
22
+ set width(v: number);
23
+ get height(): number;
24
+ set height(v: number);
25
+ get backgroundColor(): number;
26
+ set backgroundColor(v: number);
27
+ get backgroundAlpha(): number;
28
+ set backgroundAlpha(v: number);
29
+ get gravity(): number;
30
+ set gravity(v: number);
31
+ get cameraX(): number;
32
+ set cameraX(v: number);
33
+ get cameraY(): number;
34
+ set cameraY(v: number);
35
+ get backgroundImage(): string | undefined;
36
+ set backgroundImage(image: string | undefined);
37
+ }
38
+ //# sourceMappingURL=world.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../../src/world/world.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAI3E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,iBAAiB,CAAC;AAEtB,qBAAa,KAAM,SAAQ,UAAU,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,cAAc,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;CACxD,CAAC;;IACA,SAAS,iBAAiC;IAG1C,eAAe,iBAAwB;IACvC,aAAa,eAAsB;IAiCnC,mBAAmB,UAAS;gBAoEhB,IAAI,CAAC,EAAE,YAAY;IAuB/B,IAAI,KAAK,IACI,MAAM,CADoD;IACvE,IAAI,KAAK,CAAC,CAAC,EAAE,MAAM,EAAyC;IAC5D,IAAI,MAAM,IACI,MAAM,CADsD;IAC1E,IAAI,MAAM,CAAC,CAAC,EAAE,MAAM,EAA0C;IAE9D,IAAI,eAAe,IACI,MAAM,CADyC;IACtE,IAAI,eAAe,CAAC,CAAC,EAAE,MAAM,EAA+C;IAC5E,IAAI,eAAe,IACI,MAAM,CADyC;IACtE,IAAI,eAAe,CAAC,CAAC,EAAE,MAAM,EAA+C;IAC5E,IAAI,OAAO,IACI,MAAM,CAD+B;IACpD,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,EAAqC;IAE1D,IAAI,OAAO,IACI,MAAM,CADiC;IACtD,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,EAAuC;IAC5D,IAAI,OAAO,IACI,MAAM,CADiC;IACtD,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,EAAuC;IAG5D,IAAI,eAAe,IACQ,MAAM,GAAG,SAAS,CADU;IACvD,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAG5C;CACF"}
@@ -0,0 +1,5 @@
1
+ export let debugMode = false;
2
+ export function enableDebug() {
3
+ debugMode = true;
4
+ }
5
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/utils/debug.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,IAAI,SAAS,GAAG,KAAK,CAAC;AAE7B,MAAM,UAAU,WAAW;IACzB,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC","sourcesContent":["export let debugMode = false;\n\nexport function enableDebug() {\n debugMode = true;\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { AnimatedSpriteObject } from '../game-object-ext/animated-sprite';
2
+ import { DomContainerObject } from '../game-object-ext/dom-container';
3
+ import { RectangleObject } from '../game-object-ext/rect';
4
+ import { SpineObject } from '../game-object-ext/spine';
5
+ import { SpriteObject } from '../game-object-ext/sprite';
6
+ import { TextObject } from '../game-object-ext/text';
7
+ import { TilingSpriteObject } from '../game-object-ext/tiling-sprite';
8
+ import { GameObject } from '../game-object/game-object';
9
+ const GameObjectClassMap = {
10
+ 'go': GameObject,
11
+ 'sprite': SpriteObject,
12
+ 'animated-sprite': AnimatedSpriteObject,
13
+ 'tiling-sprite': TilingSpriteObject,
14
+ 'spine': SpineObject,
15
+ 'dom': DomContainerObject,
16
+ 'text': TextObject,
17
+ 'rect': RectangleObject,
18
+ };
19
+ function go(name = '', ...args) {
20
+ const go = new GameObjectClassMap[(name || 'go')]();
21
+ for (const arg of args) {
22
+ if (arg instanceof GameObject)
23
+ go.add(arg);
24
+ else if (arg) {
25
+ for (const key in arg) {
26
+ go[key] = arg[key];
27
+ }
28
+ }
29
+ }
30
+ return go;
31
+ }
32
+ export { go };
33
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../src/utils/go.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,MAAM,kBAAkB,GAAG;IACzB,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,YAAY;IACtB,iBAAiB,EAAE,oBAAoB;IACvC,eAAe,EAAE,kBAAkB;IACnC,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,kBAAkB;IACzB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,eAAe;CACf,CAAC;AAgBX,SAAS,EAAE,CACT,OAAU,EAAO,EACjB,GAAG,IAA4D;IAE/D,MAAM,EAAE,GAAG,IAAI,kBAAkB,CAAC,CAAC,IAAI,IAAI,IAAI,CAA4B,CAAC,EAAE,CAAC;IAE/E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,YAAY,UAAU;YAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aACtC,IAAI,GAAG,EAAE,CAAC;YACb,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;gBACrB,EAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAyB,CAAC;AACnC,CAAC;AAED,OAAO,EAAE,EAAE,EAAE,CAAC","sourcesContent":["import { AnimatedSpriteObject } from '../game-object-ext/animated-sprite';\nimport { DomContainerObject } from '../game-object-ext/dom-container';\nimport { RectangleObject } from '../game-object-ext/rect';\nimport { SpineObject } from '../game-object-ext/spine';\nimport { SpriteObject } from '../game-object-ext/sprite';\nimport { TextObject } from '../game-object-ext/text';\nimport { TilingSpriteObject } from '../game-object-ext/tiling-sprite';\nimport { GameObject } from '../game-object/game-object';\n\nconst GameObjectClassMap = {\n 'go': GameObject,\n 'sprite': SpriteObject,\n 'animated-sprite': AnimatedSpriteObject,\n 'tiling-sprite': TilingSpriteObject,\n 'spine': SpineObject,\n 'dom': DomContainerObject,\n 'text': TextObject,\n 'rect': RectangleObject,\n} as const;\n\ntype GameObjectNameMap = {\n [K in keyof typeof GameObjectClassMap]: InstanceType<(typeof GameObjectClassMap)[K]>;\n};\n\ntype Name = '' | keyof GameObjectNameMap;\n\ntype GameObjectByName<T extends Name> = (\n T extends '' ? GameObject\n : (\n T extends keyof GameObjectNameMap ? GameObjectNameMap[T]\n : GameObject\n )\n);\n\nfunction go<T extends Name>(\n name: T = '' as T,\n ...args: (GameObjectByName<T> | Partial<GameObjectByName<T>>)[]\n): GameObjectByName<T> {\n const go = new GameObjectClassMap[(name || 'go') as keyof GameObjectNameMap]();\n\n for (const arg of args) {\n if (arg instanceof GameObject) go.add(arg);\n else if (arg) {\n for (const key in arg) {\n (go as any)[key] = arg[key];\n }\n }\n }\n\n return go as GameObjectByName<T>;\n}\n\nexport { go };\n"]}
@@ -0,0 +1,89 @@
1
+ import Matter from 'matter-js';
2
+ import Stats from 'stats.js';
3
+ import { debugMode } from '../utils/debug';
4
+ export class WorldDebug {
5
+ #container;
6
+ #stats;
7
+ #matterDebugRenderer;
8
+ constructor(container) {
9
+ this.#container = container;
10
+ if (debugMode) {
11
+ const stats = new Stats();
12
+ stats.dom.style.position = 'absolute';
13
+ stats.showPanel(0);
14
+ container.appendChild(stats.dom);
15
+ this.#stats = stats;
16
+ }
17
+ }
18
+ update() {
19
+ this.#stats?.update();
20
+ }
21
+ createMatterDebugRenderer(engine, width, height) {
22
+ if (debugMode) {
23
+ const matterDebugRenderer = Matter.Render.create({
24
+ element: this.#container,
25
+ engine,
26
+ options: {
27
+ width,
28
+ height,
29
+ background: 'transparent',
30
+ wireframes: false,
31
+ showCollisions: true,
32
+ pixelRatio: window.devicePixelRatio,
33
+ },
34
+ });
35
+ this.#matterDebugRenderer = matterDebugRenderer;
36
+ const debugCanvas = matterDebugRenderer.canvas;
37
+ debugCanvas.style.position = 'absolute';
38
+ debugCanvas.style.zIndex = '1';
39
+ debugCanvas.style.touchAction = 'auto';
40
+ Matter.Render.run(matterDebugRenderer);
41
+ if (this.#lastRect)
42
+ this.setMatterDebugRendererSize(this.#lastRect, this.#lastWidth, this.#lastHeight, this.#lastCameraX, this.#lastCameraY);
43
+ }
44
+ }
45
+ #lastRect;
46
+ #lastWidth = 0;
47
+ #lastHeight = 0;
48
+ #lastCameraX = 0;
49
+ #lastCameraY = 0;
50
+ setMatterDebugRendererSize(rect, width, height, cameraX, cameraY) {
51
+ this.#lastRect = rect;
52
+ this.#lastWidth = width;
53
+ this.#lastHeight = height;
54
+ this.#lastCameraX = cameraX;
55
+ this.#lastCameraY = cameraY;
56
+ if (!debugMode || !this.#matterDebugRenderer)
57
+ return;
58
+ const r = this.#matterDebugRenderer;
59
+ const pr = window.devicePixelRatio || 1;
60
+ r.options.width = width;
61
+ r.options.height = height;
62
+ r.canvas.width = Math.max(1, Math.floor(width * pr));
63
+ r.canvas.height = Math.max(1, Math.floor(height * pr));
64
+ const scale = Math.min(rect.width / width, rect.height / height);
65
+ const displayW = width * scale;
66
+ const displayH = height * scale;
67
+ const left = (rect.width - displayW) / 2;
68
+ const top = (rect.height - displayH) / 2;
69
+ r.canvas.style.width = `${displayW}px`;
70
+ r.canvas.style.height = `${displayH}px`;
71
+ r.canvas.style.left = `${left}px`;
72
+ r.canvas.style.top = `${top}px`;
73
+ this.setMatterDebugRendererCamera(cameraX, cameraY);
74
+ }
75
+ setMatterDebugRendererCamera(cameraX, cameraY) {
76
+ if (this.#matterDebugRenderer) {
77
+ const r = this.#matterDebugRenderer;
78
+ const halfW = this.#lastWidth / 2;
79
+ const halfH = this.#lastHeight / 2;
80
+ r.bounds.min.x = cameraX - halfW;
81
+ r.bounds.min.y = cameraY - halfH;
82
+ r.bounds.max.x = cameraX + halfW;
83
+ r.bounds.max.y = cameraY + halfH;
84
+ Matter.Render.lookAt(r, r.bounds);
85
+ }
86
+ }
87
+ destroy() { }
88
+ }
89
+ //# sourceMappingURL=world-debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-debug.js","sourceRoot":"","sources":["../../src/world/world-debug.ts"],"names":[],"mappings":"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","sourcesContent":["import Matter from 'matter-js';\nimport Stats from 'stats.js';\nimport { debugMode } from '../utils/debug';\n\nexport class WorldDebug {\n #container: HTMLElement;\n #stats?: Stats;\n #matterDebugRenderer?: Matter.Render;\n\n constructor(container: HTMLElement) {\n this.#container = container;\n\n if (debugMode) {\n const stats = new Stats();\n stats.dom.style.position = 'absolute';\n stats.showPanel(0);\n container.appendChild(stats.dom);\n this.#stats = stats;\n }\n }\n\n update() {\n this.#stats?.update();\n }\n\n createMatterDebugRenderer(engine: Matter.Engine, width: number, height: number) {\n if (debugMode) {\n const matterDebugRenderer = Matter.Render.create({\n element: this.#container,\n engine,\n options: {\n width,\n height,\n background: 'transparent',\n wireframes: false,\n showCollisions: true,\n pixelRatio: window.devicePixelRatio,\n },\n });\n this.#matterDebugRenderer = matterDebugRenderer;\n\n const debugCanvas = matterDebugRenderer.canvas;\n debugCanvas.style.position = 'absolute';\n debugCanvas.style.zIndex = '1';\n debugCanvas.style.touchAction = 'auto';\n Matter.Render.run(matterDebugRenderer);\n\n if (this.#lastRect) this.setMatterDebugRendererSize(this.#lastRect, this.#lastWidth, this.#lastHeight, this.#lastCameraX, this.#lastCameraY);\n }\n }\n\n #lastRect?: DOMRectReadOnly;\n #lastWidth = 0;\n #lastHeight = 0;\n #lastCameraX = 0;\n #lastCameraY = 0;\n\n setMatterDebugRendererSize(\n rect: DOMRectReadOnly,\n width: number,\n height: number,\n cameraX: number,\n cameraY: number,\n ) {\n this.#lastRect = rect;\n this.#lastWidth = width;\n this.#lastHeight = height;\n this.#lastCameraX = cameraX;\n this.#lastCameraY = cameraY;\n\n if (!debugMode || !this.#matterDebugRenderer) return;\n\n const r = this.#matterDebugRenderer;\n const pr = window.devicePixelRatio || 1;\n\n r.options.width = width;\n r.options.height = height;\n\n r.canvas.width = Math.max(1, Math.floor(width * pr));\n r.canvas.height = Math.max(1, Math.floor(height * pr));\n\n const scale = Math.min(rect.width / width, rect.height / height);\n\n const displayW = width * scale;\n const displayH = height * scale;\n\n const left = (rect.width - displayW) / 2;\n const top = (rect.height - displayH) / 2;\n\n r.canvas.style.width = `${displayW}px`;\n r.canvas.style.height = `${displayH}px`;\n r.canvas.style.left = `${left}px`;\n r.canvas.style.top = `${top}px`;\n\n this.setMatterDebugRendererCamera(cameraX, cameraY);\n }\n\n setMatterDebugRendererCamera(cameraX: number, cameraY: number) {\n if (this.#matterDebugRenderer) {\n const r = this.#matterDebugRenderer;\n const halfW = this.#lastWidth / 2;\n const halfH = this.#lastHeight / 2;\n\n r.bounds.min.x = cameraX - halfW;\n r.bounds.min.y = cameraY - halfH;\n r.bounds.max.x = cameraX + halfW;\n r.bounds.max.y = cameraY + halfH;\n\n Matter.Render.lookAt(r, r.bounds);\n }\n }\n\n destroy() { }\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import { EventEmitter } from '@webtaku/event-emitter';
2
+ import Matter from 'matter-js';
3
+ export class WorldPhysics extends EventEmitter {
4
+ #engine;
5
+ #gravity = 0;
6
+ get gravity() { return this.#gravity; }
7
+ set gravity(v) {
8
+ this.#gravity = v;
9
+ if (this.#engine)
10
+ this.#engine.gravity.y = v;
11
+ }
12
+ #createEngine() {
13
+ this.#engine = Matter.Engine.create();
14
+ this.#engine.gravity.y = this.#gravity;
15
+ Matter.Events.on(this.#engine, 'collisionStart', (event) => {
16
+ event.pairs.forEach((pair) => {
17
+ const { bodyA, bodyB } = pair;
18
+ this.emit('collisionStart', bodyA.plugin.owner, bodyB.plugin.owner);
19
+ });
20
+ });
21
+ this.emit('engineCreated', this.#engine);
22
+ }
23
+ addBody(body) {
24
+ if (!this.#engine)
25
+ this.#createEngine();
26
+ Matter.World.add(this.#engine.world, body);
27
+ }
28
+ removeBody(body) {
29
+ if (!this.#engine)
30
+ return;
31
+ Matter.World.remove(this.#engine.world, body);
32
+ }
33
+ update(dt) {
34
+ if (!this.#engine)
35
+ return;
36
+ const matterDt = dt * 1000;
37
+ Matter.Engine.update(this.#engine, matterDt > 16.666 ? 16.666 : matterDt);
38
+ }
39
+ destroy() {
40
+ if (this.#engine)
41
+ Matter.Engine.clear(this.#engine);
42
+ this.#engine = undefined;
43
+ }
44
+ }
45
+ //# sourceMappingURL=world-physics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-physics.js","sourceRoot":"","sources":["../../src/world/world-physics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,MAAM,MAAM,WAAW,CAAC;AAG/B,MAAM,OAAO,YAAa,SAAQ,YAGhC;IACA,OAAO,CAAiB;IACxB,QAAQ,GAAG,CAAC,CAAC;IAEb,IAAI,OAAO,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,CAAS;QACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,aAAa;QACX,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEvC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;YACzD,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,IAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,UAAU,CAAC,IAAiB;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC3B,CAAC;CACF","sourcesContent":["import { EventEmitter } from '@webtaku/event-emitter';\nimport Matter from 'matter-js';\nimport { GameObject } from '../game-object/game-object';\n\nexport class WorldPhysics extends EventEmitter<{\n engineCreated: (engine: Matter.Engine) => void;\n collisionStart: (a: GameObject, b: GameObject) => void;\n}> {\n #engine?: Matter.Engine;\n #gravity = 0;\n\n get gravity() { return this.#gravity; }\n set gravity(v: number) {\n this.#gravity = v;\n if (this.#engine) this.#engine.gravity.y = v;\n }\n\n #createEngine() {\n this.#engine = Matter.Engine.create();\n this.#engine.gravity.y = this.#gravity;\n\n Matter.Events.on(this.#engine, 'collisionStart', (event) => {\n event.pairs.forEach((pair) => {\n const { bodyA, bodyB } = pair;\n this.emit('collisionStart', bodyA.plugin.owner, bodyB.plugin.owner);\n });\n });\n\n this.emit('engineCreated', this.#engine);\n }\n\n addBody(body: Matter.Body) {\n if (!this.#engine) this.#createEngine();\n Matter.World.add(this.#engine!.world, body);\n }\n\n removeBody(body: Matter.Body) {\n if (!this.#engine) return;\n Matter.World.remove(this.#engine!.world, body);\n }\n\n update(dt: number) {\n if (!this.#engine) return;\n const matterDt = dt * 1000;\n Matter.Engine.update(this.#engine, matterDt > 16.666 ? 16.666 : matterDt);\n }\n\n destroy() {\n if (this.#engine) Matter.Engine.clear(this.#engine);\n this.#engine = undefined;\n }\n}\n"]}
@@ -0,0 +1,123 @@
1
+ import { autoDetectRenderer, Container, EventEmitter, Sprite } from "pixi.js";
2
+ import { textureLoader } from '../asset/loaders/texture';
3
+ export class WorldRendering extends EventEmitter {
4
+ #renderer;
5
+ #root = new Container();
6
+ #backgroundAlpha = 1;
7
+ #cameraX = 0;
8
+ #cameraY = 0;
9
+ centerX = 0;
10
+ centerY = 0;
11
+ renderWidth = 0;
12
+ renderHeight = 0;
13
+ renderScale = 1;
14
+ canvasLeft = 0;
15
+ canvasTop = 0;
16
+ #backgroundColor = 0x304C79;
17
+ get backgroundColor() { return this.#backgroundColor; }
18
+ set backgroundColor(v) {
19
+ this.#backgroundColor = v;
20
+ if (this.#renderer)
21
+ this.#renderer.background.color = v;
22
+ }
23
+ get backgroundAlpha() { return this.#backgroundAlpha; }
24
+ set backgroundAlpha(v) {
25
+ this.#backgroundAlpha = v;
26
+ if (this.#renderer)
27
+ this.#renderer.background.alpha = v;
28
+ }
29
+ async init(container, width, height) {
30
+ const renderer = await autoDetectRenderer({
31
+ width,
32
+ height,
33
+ backgroundColor: this.#backgroundColor,
34
+ backgroundAlpha: this.#backgroundAlpha,
35
+ eventMode: 'none',
36
+ resolution: window.devicePixelRatio,
37
+ });
38
+ this.#renderer = renderer;
39
+ const canvas = renderer.canvas;
40
+ canvas.style.position = 'absolute';
41
+ canvas.style.touchAction = 'auto';
42
+ canvas.style.borderRadius = container.style.borderRadius;
43
+ container.appendChild(canvas);
44
+ if (this.#lastRect)
45
+ this.setRendererSize(this.#lastRect, this.#lastWidth, this.#lastHeight);
46
+ }
47
+ #applyPosition() {
48
+ this.#root.x = this.centerX - this.#cameraX;
49
+ this.#root.y = this.centerY - this.#cameraY;
50
+ if (this.#backgroundSprite) {
51
+ this.#backgroundSprite.x = this.#cameraX;
52
+ this.#backgroundSprite.y = this.#cameraY;
53
+ }
54
+ this.emit('positionChanged');
55
+ }
56
+ #lastRect;
57
+ #lastWidth = 0;
58
+ #lastHeight = 0;
59
+ setRendererSize(rect, width, height) {
60
+ this.#lastRect = rect;
61
+ this.#lastWidth = width;
62
+ this.#lastHeight = height;
63
+ this.centerX = width / 2;
64
+ this.centerY = height / 2;
65
+ this.#applyPosition();
66
+ this.renderWidth = width;
67
+ this.renderHeight = height;
68
+ const scale = Math.min(rect.width / width, rect.height / height);
69
+ this.renderScale = scale;
70
+ const displayW = width * scale;
71
+ const displayH = height * scale;
72
+ const left = (rect.width - displayW) / 2;
73
+ const top = (rect.height - displayH) / 2;
74
+ this.canvasLeft = left;
75
+ this.canvasTop = top;
76
+ if (!this.#renderer)
77
+ return;
78
+ this.#renderer.resize(width, height);
79
+ const canvas = this.#renderer.canvas;
80
+ canvas.style.width = `${displayW}px`;
81
+ canvas.style.height = `${displayH}px`;
82
+ canvas.style.left = `${left}px`;
83
+ canvas.style.top = `${top}px`;
84
+ }
85
+ update() {
86
+ this.#renderer?.render(this.#root);
87
+ }
88
+ get cameraX() { return this.#cameraX; }
89
+ set cameraX(value) { this.#cameraX = value; this.#applyPosition(); }
90
+ get cameraY() { return this.#cameraY; }
91
+ set cameraY(value) { this.#cameraY = value; this.#applyPosition(); }
92
+ addPixiChildToRoot(child) {
93
+ this.#root.addChild(child);
94
+ }
95
+ destroy() {
96
+ this.#renderer?.destroy();
97
+ this.#renderer = undefined;
98
+ }
99
+ #backgroundSprite;
100
+ setBackgroundImage(image) {
101
+ if (image) {
102
+ if (!textureLoader.checkLoaded(image)) {
103
+ console.info(`Background image not preloaded. Loading now: ${image}`);
104
+ }
105
+ textureLoader.load(image).then((texture) => {
106
+ if (texture) {
107
+ this.#backgroundSprite?.destroy();
108
+ this.#backgroundSprite = new Sprite({
109
+ x: this.#cameraX,
110
+ y: this.#cameraY,
111
+ texture,
112
+ anchor: { x: 0.5, y: 0.5 },
113
+ width: this.renderWidth,
114
+ height: this.renderHeight,
115
+ zIndex: -999999,
116
+ });
117
+ this.#root.addChild(this.#backgroundSprite);
118
+ }
119
+ });
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=world-rendering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-rendering.js","sourceRoot":"","sources":["../../src/world/world-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import { autoDetectRenderer, Container, EventEmitter, Renderer, Sprite } from \"pixi.js\";\nimport { textureLoader } from '../asset/loaders/texture';\n\nexport class WorldRendering extends EventEmitter<{\n positionChanged: () => void;\n}> {\n #renderer?: Renderer;\n #root = new Container();\n #backgroundAlpha = 1;\n\n #cameraX = 0;\n #cameraY = 0;\n\n centerX = 0;\n centerY = 0;\n renderWidth = 0;\n renderHeight = 0;\n renderScale = 1;\n canvasLeft = 0;\n canvasTop = 0;\n\n #backgroundColor = 0x304C79;\n get backgroundColor() { return this.#backgroundColor; }\n set backgroundColor(v: number) {\n this.#backgroundColor = v;\n if (this.#renderer) this.#renderer.background.color = v;\n }\n\n get backgroundAlpha() { return this.#backgroundAlpha; }\n set backgroundAlpha(v: number) {\n this.#backgroundAlpha = v;\n if (this.#renderer) this.#renderer.background.alpha = v;\n }\n\n async init(container: HTMLElement, width: number | undefined, height: number | undefined) {\n const renderer = await autoDetectRenderer({\n width,\n height,\n backgroundColor: this.#backgroundColor,\n backgroundAlpha: this.#backgroundAlpha,\n eventMode: 'none',\n resolution: window.devicePixelRatio,\n });\n this.#renderer = renderer;\n\n const canvas = renderer.canvas;\n canvas.style.position = 'absolute';\n canvas.style.touchAction = 'auto';\n canvas.style.borderRadius = container.style.borderRadius;\n container.appendChild(canvas);\n\n if (this.#lastRect) this.setRendererSize(this.#lastRect, this.#lastWidth, this.#lastHeight);\n }\n\n #applyPosition() {\n this.#root.x = this.centerX - this.#cameraX;\n this.#root.y = this.centerY - this.#cameraY;\n\n if (this.#backgroundSprite) {\n this.#backgroundSprite.x = this.#cameraX;\n this.#backgroundSprite.y = this.#cameraY;\n }\n\n this.emit('positionChanged');\n }\n\n #lastRect?: DOMRect;\n #lastWidth = 0;\n #lastHeight = 0;\n\n setRendererSize(rect: DOMRect, width: number, height: number) {\n this.#lastRect = rect;\n this.#lastWidth = width;\n this.#lastHeight = height;\n\n this.centerX = width / 2;\n this.centerY = height / 2;\n this.#applyPosition();\n\n this.renderWidth = width;\n this.renderHeight = height;\n\n const scale = Math.min(rect.width / width, rect.height / height);\n this.renderScale = scale;\n\n const displayW = width * scale;\n const displayH = height * scale;\n\n const left = (rect.width - displayW) / 2;\n const top = (rect.height - displayH) / 2;\n this.canvasLeft = left;\n this.canvasTop = top;\n\n if (!this.#renderer) return;\n this.#renderer.resize(width, height);\n\n const canvas = this.#renderer.canvas;\n canvas.style.width = `${displayW}px`;\n canvas.style.height = `${displayH}px`;\n canvas.style.left = `${left}px`;\n canvas.style.top = `${top}px`;\n }\n\n update() {\n this.#renderer?.render(this.#root);\n }\n\n get cameraX() { return this.#cameraX; }\n set cameraX(value: number) { this.#cameraX = value; this.#applyPosition(); }\n get cameraY() { return this.#cameraY; }\n set cameraY(value: number) { this.#cameraY = value; this.#applyPosition(); }\n\n addPixiChildToRoot(child: Container) {\n this.#root.addChild(child);\n }\n\n destroy() {\n this.#renderer?.destroy();\n this.#renderer = undefined;\n }\n\n #backgroundSprite?: Sprite;\n setBackgroundImage(image: string | undefined) {\n if (image) {\n if (!textureLoader.checkLoaded(image)) {\n console.info(`Background image not preloaded. Loading now: ${image}`);\n }\n textureLoader.load(image).then((texture) => {\n if (texture) {\n this.#backgroundSprite?.destroy();\n this.#backgroundSprite = new Sprite({\n x: this.#cameraX,\n y: this.#cameraY,\n texture,\n anchor: { x: 0.5, y: 0.5 },\n width: this.renderWidth,\n height: this.renderHeight,\n zIndex: -999999,\n });\n this.#root.addChild(this.#backgroundSprite);\n }\n });\n }\n }\n}\n"]}