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.
- package/LICENSE +21 -0
- package/README.md +8 -0
- package/assets/logo.png +0 -0
- package/examples/package.json +13 -0
- package/examples/test-dom/index.html +24 -0
- package/examples/test-dom/index.ts +21 -0
- package/examples/tsconfig.json +22 -0
- package/examples/webpack.config.js +31 -0
- package/lib/asset/audio.js +158 -0
- package/lib/asset/audio.js.map +1 -0
- package/lib/asset/loaders/audio.js +35 -0
- package/lib/asset/loaders/audio.js.map +1 -0
- package/lib/asset/loaders/binary.js +28 -0
- package/lib/asset/loaders/binary.js.map +1 -0
- package/lib/asset/loaders/font.js +27 -0
- package/lib/asset/loaders/font.js.map +1 -0
- package/lib/asset/loaders/loader.js +37 -0
- package/lib/asset/loaders/loader.js.map +1 -0
- package/lib/asset/loaders/spritesheet.js +56 -0
- package/lib/asset/loaders/spritesheet.js.map +1 -0
- package/lib/asset/loaders/text.js +27 -0
- package/lib/asset/loaders/text.js.map +1 -0
- package/lib/asset/loaders/texture.js +38 -0
- package/lib/asset/loaders/texture.js.map +1 -0
- package/lib/asset/preload.js +69 -0
- package/lib/asset/preload.js.map +1 -0
- package/lib/game-object/game-object-physics.js +188 -0
- package/lib/game-object/game-object-physics.js.map +1 -0
- package/lib/game-object/game-object-rendering.js +35 -0
- package/lib/game-object/game-object-rendering.js.map +1 -0
- package/lib/game-object/game-object.js +162 -0
- package/lib/game-object/game-object.js.map +1 -0
- package/lib/game-object/transform.js +118 -0
- package/lib/game-object/transform.js.map +1 -0
- package/lib/game-object-ext/animated-sprite.js +117 -0
- package/lib/game-object-ext/animated-sprite.js.map +1 -0
- package/lib/game-object-ext/dom-container.js +56 -0
- package/lib/game-object-ext/dom-container.js.map +1 -0
- package/lib/game-object-ext/rect.js +30 -0
- package/lib/game-object-ext/rect.js.map +1 -0
- package/lib/game-object-ext/spine.js +206 -0
- package/lib/game-object-ext/spine.js.map +1 -0
- package/lib/game-object-ext/sprite.js +46 -0
- package/lib/game-object-ext/sprite.js.map +1 -0
- package/lib/game-object-ext/text.js +68 -0
- package/lib/game-object-ext/text.js.map +1 -0
- package/lib/game-object-ext/tiling-sprite.js +64 -0
- package/lib/game-object-ext/tiling-sprite.js.map +1 -0
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -0
- package/lib/types/asset/audio.d.ts +21 -0
- package/lib/types/asset/audio.d.ts.map +1 -0
- package/lib/types/asset/loaders/audio.d.ts +7 -0
- package/lib/types/asset/loaders/audio.d.ts.map +1 -0
- package/lib/types/asset/loaders/binary.d.ts +7 -0
- package/lib/types/asset/loaders/binary.d.ts.map +1 -0
- package/lib/types/asset/loaders/font.d.ts +7 -0
- package/lib/types/asset/loaders/font.d.ts.map +1 -0
- package/lib/types/asset/loaders/loader.d.ts +13 -0
- package/lib/types/asset/loaders/loader.d.ts.map +1 -0
- package/lib/types/asset/loaders/spritesheet.d.ts +11 -0
- package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -0
- package/lib/types/asset/loaders/text.d.ts +7 -0
- package/lib/types/asset/loaders/text.d.ts.map +1 -0
- package/lib/types/asset/loaders/texture.d.ts +9 -0
- package/lib/types/asset/loaders/texture.d.ts.map +1 -0
- package/lib/types/asset/preload.d.ts +8 -0
- package/lib/types/asset/preload.d.ts.map +1 -0
- package/lib/types/game-object/game-object-physics.d.ts +42 -0
- package/lib/types/game-object/game-object-physics.d.ts.map +1 -0
- package/lib/types/game-object/game-object-rendering.d.ts +15 -0
- package/lib/types/game-object/game-object-rendering.d.ts.map +1 -0
- package/lib/types/game-object/game-object.d.ts +81 -0
- package/lib/types/game-object/game-object.d.ts.map +1 -0
- package/lib/types/game-object/transform.d.ts +43 -0
- package/lib/types/game-object/transform.d.ts.map +1 -0
- package/lib/types/game-object-ext/animated-sprite.d.ts +29 -0
- package/lib/types/game-object-ext/animated-sprite.d.ts.map +1 -0
- package/lib/types/game-object-ext/dom-container.d.ts +16 -0
- package/lib/types/game-object-ext/dom-container.d.ts.map +1 -0
- package/lib/types/game-object-ext/rect.d.ts +17 -0
- package/lib/types/game-object-ext/rect.d.ts.map +1 -0
- package/lib/types/game-object-ext/spine.d.ts +35 -0
- package/lib/types/game-object-ext/spine.d.ts.map +1 -0
- package/lib/types/game-object-ext/sprite.d.ts +14 -0
- package/lib/types/game-object-ext/sprite.d.ts.map +1 -0
- package/lib/types/game-object-ext/text.d.ts +26 -0
- package/lib/types/game-object-ext/text.d.ts.map +1 -0
- package/lib/types/game-object-ext/tiling-sprite.d.ts +20 -0
- package/lib/types/game-object-ext/tiling-sprite.d.ts.map +1 -0
- package/lib/types/index.d.ts +14 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/utils/debug.d.ts +3 -0
- package/lib/types/utils/debug.d.ts.map +1 -0
- package/lib/types/utils/go.d.ts +26 -0
- package/lib/types/utils/go.d.ts.map +1 -0
- package/lib/types/world/world-debug.d.ts +11 -0
- package/lib/types/world/world-debug.d.ts.map +1 -0
- package/lib/types/world/world-physics.d.ts +16 -0
- package/lib/types/world/world-physics.d.ts.map +1 -0
- package/lib/types/world/world-rendering.d.ts +28 -0
- package/lib/types/world/world-rendering.d.ts.map +1 -0
- package/lib/types/world/world.d.ts +38 -0
- package/lib/types/world/world.d.ts.map +1 -0
- package/lib/utils/debug.js +5 -0
- package/lib/utils/debug.js.map +1 -0
- package/lib/utils/go.js +33 -0
- package/lib/utils/go.js.map +1 -0
- package/lib/world/world-debug.js +89 -0
- package/lib/world/world-debug.js.map +1 -0
- package/lib/world/world-physics.js +45 -0
- package/lib/world/world-physics.js.map +1 -0
- package/lib/world/world-rendering.js +123 -0
- package/lib/world/world-rendering.js.map +1 -0
- package/lib/world/world.js +147 -0
- package/lib/world/world.js.map +1 -0
- package/package.json +23 -0
- package/src/asset/audio.ts +176 -0
- package/src/asset/loaders/audio.ts +39 -0
- package/src/asset/loaders/binary.ts +32 -0
- package/src/asset/loaders/font.ts +27 -0
- package/src/asset/loaders/loader.ts +39 -0
- package/src/asset/loaders/spritesheet.ts +67 -0
- package/src/asset/loaders/text.ts +31 -0
- package/src/asset/loaders/texture.ts +46 -0
- package/src/asset/preload.ts +76 -0
- package/src/game-object/game-object-physics.ts +191 -0
- package/src/game-object/game-object-rendering.ts +27 -0
- package/src/game-object/game-object.ts +190 -0
- package/src/game-object/transform.ts +164 -0
- package/src/game-object-ext/animated-sprite.ts +140 -0
- package/src/game-object-ext/dom-container.ts +67 -0
- package/src/game-object-ext/rect.ts +40 -0
- package/src/game-object-ext/spine.ts +235 -0
- package/src/game-object-ext/sprite.ts +55 -0
- package/src/game-object-ext/text.ts +83 -0
- package/src/game-object-ext/tiling-sprite.ts +73 -0
- package/src/index.ts +14 -0
- package/src/utils/debug.ts +5 -0
- package/src/utils/go.ts +53 -0
- package/src/world/world-debug.ts +114 -0
- package/src/world/world-physics.ts +52 -0
- package/src/world/world-rendering.ts +145 -0
- package/src/world/world.ts +171 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"]}
|
package/lib/utils/go.js
ADDED
|
@@ -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"]}
|