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,69 @@
|
|
|
1
|
+
import { audioLoader } from './loaders/audio';
|
|
2
|
+
import { fontFamilyLoader } from './loaders/font';
|
|
3
|
+
import { getCachedId, spritesheetLoader } from './loaders/spritesheet';
|
|
4
|
+
import { textureLoader } from './loaders/texture';
|
|
5
|
+
function isImage(path) {
|
|
6
|
+
return path.endsWith('.png') ||
|
|
7
|
+
path.endsWith('.jpg') ||
|
|
8
|
+
path.endsWith('.jpeg') ||
|
|
9
|
+
path.endsWith('.gif') ||
|
|
10
|
+
path.endsWith('.webp');
|
|
11
|
+
}
|
|
12
|
+
function isAudio(path) {
|
|
13
|
+
return path.endsWith('.mp3') ||
|
|
14
|
+
path.endsWith('.wav') ||
|
|
15
|
+
path.endsWith('.ogg');
|
|
16
|
+
}
|
|
17
|
+
function isFontFamily(fontFamily) {
|
|
18
|
+
return !fontFamily.includes('.');
|
|
19
|
+
}
|
|
20
|
+
async function preload(assets, progressCallback) {
|
|
21
|
+
const total = assets.length;
|
|
22
|
+
let loaded = 0;
|
|
23
|
+
await Promise.all(assets.map(async (asset) => {
|
|
24
|
+
if (typeof asset === 'string') {
|
|
25
|
+
if (isImage(asset)) {
|
|
26
|
+
await textureLoader.load(asset);
|
|
27
|
+
}
|
|
28
|
+
else if (isAudio(asset)) {
|
|
29
|
+
await audioLoader.load(asset);
|
|
30
|
+
}
|
|
31
|
+
else if (isFontFamily(asset)) {
|
|
32
|
+
await fontFamilyLoader.load(asset);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.error(`Unknown asset type: ${asset}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const id = getCachedId(asset.src, asset.atlas);
|
|
40
|
+
await spritesheetLoader.load(id, asset.src, asset.atlas);
|
|
41
|
+
}
|
|
42
|
+
loaded++;
|
|
43
|
+
progressCallback?.(loaded / total);
|
|
44
|
+
}));
|
|
45
|
+
return () => {
|
|
46
|
+
assets.forEach((asset) => {
|
|
47
|
+
if (typeof asset === 'string') {
|
|
48
|
+
if (isImage(asset)) {
|
|
49
|
+
textureLoader.release(asset);
|
|
50
|
+
}
|
|
51
|
+
else if (isAudio(asset)) {
|
|
52
|
+
audioLoader.release(asset);
|
|
53
|
+
}
|
|
54
|
+
else if (isFontFamily(asset)) {
|
|
55
|
+
fontFamilyLoader.release(asset);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.error(`Unknown asset type: ${asset}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const id = getCachedId(asset.src, asset.atlas);
|
|
63
|
+
spritesheetLoader.release(id);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export { preload };
|
|
69
|
+
//# sourceMappingURL=preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preload.js","sourceRoot":"","sources":["../../src/asset/preload.ts"],"names":[],"mappings":"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","sourcesContent":["import { SpritesheetData } from 'pixi.js';\nimport { audioLoader } from './loaders/audio';\nimport { fontFamilyLoader } from './loaders/font';\nimport { getCachedId, spritesheetLoader } from './loaders/spritesheet';\nimport { textureLoader } from './loaders/texture';\n\ntype AssetSource = string | {\n src: string;\n atlas: SpritesheetData;\n};\n\nfunction isImage(path: string): boolean {\n return path.endsWith('.png') ||\n path.endsWith('.jpg') ||\n path.endsWith('.jpeg') ||\n path.endsWith('.gif') ||\n path.endsWith('.webp');\n}\n\nfunction isAudio(path: string): boolean {\n return path.endsWith('.mp3') ||\n path.endsWith('.wav') ||\n path.endsWith('.ogg');\n}\n\nfunction isFontFamily(fontFamily: string): boolean {\n return !fontFamily.includes('.');\n}\n\nasync function preload(assets: AssetSource[], progressCallback: (progress: number) => void) {\n const total = assets.length;\n let loaded = 0;\n\n await Promise.all(assets.map(async (asset) => {\n if (typeof asset === 'string') {\n if (isImage(asset)) {\n await textureLoader.load(asset);\n } else if (isAudio(asset)) {\n await audioLoader.load(asset);\n } else if (isFontFamily(asset)) {\n await fontFamilyLoader.load(asset);\n } else {\n console.error(`Unknown asset type: ${asset}`);\n }\n }\n else {\n const id = getCachedId(asset.src, asset.atlas);\n await spritesheetLoader.load(id, asset.src, asset.atlas);\n }\n\n loaded++;\n progressCallback?.(loaded / total);\n }));\n\n return () => {\n assets.forEach((asset) => {\n if (typeof asset === 'string') {\n if (isImage(asset)) {\n textureLoader.release(asset);\n } else if (isAudio(asset)) {\n audioLoader.release(asset);\n } else if (isFontFamily(asset)) {\n fontFamilyLoader.release(asset);\n } else {\n console.error(`Unknown asset type: ${asset}`);\n }\n }\n else {\n const id = getCachedId(asset.src, asset.atlas);\n spritesheetLoader.release(id);\n }\n });\n };\n}\n\nexport { AssetSource, preload };\n"]}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import Matter from 'matter-js';
|
|
2
|
+
import { debugMode } from '../utils/debug';
|
|
3
|
+
import { localOffsetToWorld, worldToLocalWithNewWorld } from './transform';
|
|
4
|
+
export class GameObjectPhysics {
|
|
5
|
+
#collider;
|
|
6
|
+
#isStatic = false;
|
|
7
|
+
#isSensor = false;
|
|
8
|
+
#velocityX = 0;
|
|
9
|
+
#velocityY = 0;
|
|
10
|
+
#fixedRotation = false;
|
|
11
|
+
#go;
|
|
12
|
+
#matterBody;
|
|
13
|
+
constructor(go) {
|
|
14
|
+
this.#go = go;
|
|
15
|
+
}
|
|
16
|
+
#removeBody() {
|
|
17
|
+
const world = this.#go._getWorld();
|
|
18
|
+
if (!world || !this.#matterBody)
|
|
19
|
+
return;
|
|
20
|
+
world._worldPhysics.removeBody(this.#matterBody);
|
|
21
|
+
}
|
|
22
|
+
#lastScaleX = 1;
|
|
23
|
+
#lastScaleY = 1;
|
|
24
|
+
#initialInertia;
|
|
25
|
+
#createBody() {
|
|
26
|
+
const world = this.#go._getWorld();
|
|
27
|
+
if (!this.#collider || !world)
|
|
28
|
+
return;
|
|
29
|
+
const wt = this.#go._wt;
|
|
30
|
+
const { x: ox, y: oy } = localOffsetToWorld(wt, this.#collider?.x ?? 0, this.#collider?.y ?? 0);
|
|
31
|
+
const x = wt.x.v + ox;
|
|
32
|
+
const y = wt.y.v + oy;
|
|
33
|
+
const bodyOpts = {
|
|
34
|
+
angle: wt.rotation.v,
|
|
35
|
+
isStatic: this.#isStatic,
|
|
36
|
+
isSensor: this.#isSensor,
|
|
37
|
+
velocity: { x: this.#velocityX, y: this.#velocityY },
|
|
38
|
+
};
|
|
39
|
+
if (this.#collider.type === 'rect')
|
|
40
|
+
this.#matterBody = Matter.Bodies.rectangle(x, y, this.#collider.width, this.#collider.height, bodyOpts);
|
|
41
|
+
else if (this.#collider.type === 'circle')
|
|
42
|
+
this.#matterBody = Matter.Bodies.circle(x, y, this.#collider.radius, bodyOpts);
|
|
43
|
+
else if (this.#collider.type === 'vert')
|
|
44
|
+
this.#matterBody = Matter.Bodies.fromVertices(x, y, [this.#collider.vertices], bodyOpts);
|
|
45
|
+
else
|
|
46
|
+
throw new Error('Invalid collider type');
|
|
47
|
+
this.#matterBody.plugin.owner = this.#go;
|
|
48
|
+
this.#lastScaleX = wt.scaleX.v;
|
|
49
|
+
this.#lastScaleY = wt.scaleY.v;
|
|
50
|
+
Matter.Body.scale(this.#matterBody, wt.scaleX.v, wt.scaleY.v);
|
|
51
|
+
this.#initialInertia = this.#matterBody.inertia;
|
|
52
|
+
if (this.#fixedRotation) {
|
|
53
|
+
Matter.Body.setInertia(this.#matterBody, Infinity);
|
|
54
|
+
Matter.Body.setAngularVelocity(this.#matterBody, 0);
|
|
55
|
+
}
|
|
56
|
+
world._worldPhysics.addBody(this.#matterBody);
|
|
57
|
+
this.#setDebugRenderStyle();
|
|
58
|
+
}
|
|
59
|
+
applyChanges() {
|
|
60
|
+
if (this.#collider && !this.#matterBody)
|
|
61
|
+
this.#createBody();
|
|
62
|
+
if (!this.#matterBody)
|
|
63
|
+
return;
|
|
64
|
+
const wt = this.#go._wt;
|
|
65
|
+
const { x: ox, y: oy } = localOffsetToWorld(wt, this.#collider?.x ?? 0, this.#collider?.y ?? 0);
|
|
66
|
+
if (wt.x.dirty || wt.scaleX.dirty || wt.y.dirty || wt.scaleY.dirty) {
|
|
67
|
+
if ((wt.x.dirty || wt.scaleX.dirty) && (wt.y.dirty || wt.scaleY.dirty))
|
|
68
|
+
Matter.Body.setPosition(this.#matterBody, { x: wt.x.v + ox, y: wt.y.v + oy });
|
|
69
|
+
else if (wt.x.dirty || wt.scaleX.dirty)
|
|
70
|
+
Matter.Body.setPosition(this.#matterBody, { x: wt.x.v + ox, y: this.#matterBody.position.y });
|
|
71
|
+
else if (wt.y.dirty || wt.scaleY.dirty)
|
|
72
|
+
Matter.Body.setPosition(this.#matterBody, { x: this.#matterBody.position.x, y: wt.y.v + oy });
|
|
73
|
+
}
|
|
74
|
+
if (wt.scaleX.dirty || wt.scaleY.dirty) {
|
|
75
|
+
const scaleDiffX = wt.scaleX.v / this.#lastScaleX;
|
|
76
|
+
const scaleDiffY = wt.scaleY.v / this.#lastScaleY;
|
|
77
|
+
Matter.Body.scale(this.#matterBody, scaleDiffX, scaleDiffY);
|
|
78
|
+
this.#lastScaleX = wt.scaleX.v;
|
|
79
|
+
this.#lastScaleY = wt.scaleY.v;
|
|
80
|
+
}
|
|
81
|
+
if (wt.rotation.dirty)
|
|
82
|
+
Matter.Body.setAngle(this.#matterBody, wt.rotation.v);
|
|
83
|
+
const lt = this.#go._lt;
|
|
84
|
+
if (!wt.x.dirty || !wt.y.dirty || !wt.rotation.dirty) {
|
|
85
|
+
const { x, y, rotation, newWorldX, newWorldY, newWorldRotation } = worldToLocalWithNewWorld(wt, lt, this.#matterBody.position.x - ox, this.#matterBody.position.y - oy, this.#matterBody.angle);
|
|
86
|
+
if (!wt.x.dirty) {
|
|
87
|
+
lt.x.v = x;
|
|
88
|
+
wt.x.v = newWorldX;
|
|
89
|
+
}
|
|
90
|
+
if (!wt.y.dirty) {
|
|
91
|
+
lt.y.v = y;
|
|
92
|
+
wt.y.v = newWorldY;
|
|
93
|
+
}
|
|
94
|
+
if (!wt.rotation.dirty) {
|
|
95
|
+
lt.rotation.v = rotation;
|
|
96
|
+
wt.rotation.v = newWorldRotation;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
destroy() {
|
|
101
|
+
this.#removeBody();
|
|
102
|
+
}
|
|
103
|
+
get collider() { return this.#collider; }
|
|
104
|
+
set collider(value) {
|
|
105
|
+
this.#removeBody();
|
|
106
|
+
this.#collider = value;
|
|
107
|
+
}
|
|
108
|
+
get isStatic() {
|
|
109
|
+
if (this.#matterBody)
|
|
110
|
+
return this.#matterBody.isStatic;
|
|
111
|
+
else
|
|
112
|
+
return this.#isStatic;
|
|
113
|
+
}
|
|
114
|
+
set isStatic(value) {
|
|
115
|
+
this.#isStatic = value;
|
|
116
|
+
if (this.#matterBody)
|
|
117
|
+
Matter.Body.setStatic(this.#matterBody, value);
|
|
118
|
+
this.#setDebugRenderStyle();
|
|
119
|
+
}
|
|
120
|
+
get isSensor() {
|
|
121
|
+
if (this.#matterBody)
|
|
122
|
+
return this.#matterBody.isSensor;
|
|
123
|
+
else
|
|
124
|
+
return this.#isSensor;
|
|
125
|
+
}
|
|
126
|
+
set isSensor(value) {
|
|
127
|
+
this.#isSensor = value;
|
|
128
|
+
if (this.#matterBody)
|
|
129
|
+
this.#matterBody.isSensor = value;
|
|
130
|
+
this.#setDebugRenderStyle();
|
|
131
|
+
}
|
|
132
|
+
get velocityX() {
|
|
133
|
+
if (this.#matterBody)
|
|
134
|
+
return this.#matterBody.velocity.x;
|
|
135
|
+
else
|
|
136
|
+
return this.#velocityX;
|
|
137
|
+
}
|
|
138
|
+
set velocityX(value) {
|
|
139
|
+
this.#velocityX = value;
|
|
140
|
+
if (this.#matterBody)
|
|
141
|
+
Matter.Body.setVelocity(this.#matterBody, { x: value, y: this.#velocityY });
|
|
142
|
+
}
|
|
143
|
+
get velocityY() {
|
|
144
|
+
if (this.#matterBody)
|
|
145
|
+
return this.#matterBody.velocity.y;
|
|
146
|
+
else
|
|
147
|
+
return this.#velocityY;
|
|
148
|
+
}
|
|
149
|
+
set velocityY(value) {
|
|
150
|
+
this.#velocityY = value;
|
|
151
|
+
if (this.#matterBody)
|
|
152
|
+
Matter.Body.setVelocity(this.#matterBody, { x: this.#velocityX, y: value });
|
|
153
|
+
}
|
|
154
|
+
get fixedRotation() { return this.#fixedRotation; }
|
|
155
|
+
set fixedRotation(value) {
|
|
156
|
+
this.#fixedRotation = value;
|
|
157
|
+
if (this.#matterBody) {
|
|
158
|
+
if (value) {
|
|
159
|
+
Matter.Body.setInertia(this.#matterBody, Infinity);
|
|
160
|
+
Matter.Body.setAngularVelocity(this.#matterBody, 0);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
Matter.Body.setInertia(this.#matterBody, this.#initialInertia);
|
|
164
|
+
Matter.Body.setAngularVelocity(this.#matterBody, 0);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
#setDebugRenderStyle() {
|
|
169
|
+
if (!debugMode || !this.#matterBody)
|
|
170
|
+
return;
|
|
171
|
+
if (this.#isSensor) {
|
|
172
|
+
this.#matterBody.render.fillStyle = 'rgba(255,255,0,0.1)';
|
|
173
|
+
this.#matterBody.render.strokeStyle = 'rgba(255,255,0,0.25)';
|
|
174
|
+
this.#matterBody.render.lineWidth = 1;
|
|
175
|
+
}
|
|
176
|
+
else if (this.#isStatic) {
|
|
177
|
+
this.#matterBody.render.fillStyle = 'rgba(255,0,0,0.1)';
|
|
178
|
+
this.#matterBody.render.strokeStyle = 'rgba(255,0,0,0.25)';
|
|
179
|
+
this.#matterBody.render.lineWidth = 1;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
this.#matterBody.render.fillStyle = 'rgba(0,255,0,0.1)';
|
|
183
|
+
this.#matterBody.render.strokeStyle = 'rgba(0,255,0,0.25)';
|
|
184
|
+
this.#matterBody.render.lineWidth = 1;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=game-object-physics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-object-physics.js","sourceRoot":"","sources":["../../src/game-object/game-object-physics.ts"],"names":[],"mappings":"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","sourcesContent":["import Matter, { IChamferableBodyDefinition } from 'matter-js';\nimport { debugMode } from '../utils/debug';\nimport { GameObject } from './game-object';\nimport { localOffsetToWorld, worldToLocalWithNewWorld } from './transform';\n\ntype BaseCollider = { x?: number; y?: number; };\ntype RectangleCollider = BaseCollider & { type: 'rect'; width: number; height: number };\ntype CircleCollider = BaseCollider & { type: 'circle'; radius: number };\ntype VerticesCollider = BaseCollider & { type: 'vert'; vertices: { x: number; y: number }[] };\nexport type Collider = RectangleCollider | CircleCollider | VerticesCollider;\n\nexport class GameObjectPhysics {\n #collider?: Collider;\n #isStatic = false;\n #isSensor = false;\n #velocityX = 0;\n #velocityY = 0;\n #fixedRotation = false;\n\n #go: GameObject;\n #matterBody?: Matter.Body;\n\n constructor(go: GameObject) {\n this.#go = go;\n }\n\n #removeBody() {\n const world = this.#go._getWorld();\n if (!world || !this.#matterBody) return;\n world._worldPhysics.removeBody(this.#matterBody);\n }\n\n #lastScaleX = 1;\n #lastScaleY = 1;\n #initialInertia?: number;\n\n #createBody() {\n const world = this.#go._getWorld();\n if (!this.#collider || !world) return;\n\n const wt = this.#go._wt;\n const { x: ox, y: oy } = localOffsetToWorld(wt, this.#collider?.x ?? 0, this.#collider?.y ?? 0);\n const x = wt.x.v + ox;\n const y = wt.y.v + oy;\n\n const bodyOpts: IChamferableBodyDefinition = {\n angle: wt.rotation.v,\n isStatic: this.#isStatic,\n isSensor: this.#isSensor,\n velocity: { x: this.#velocityX, y: this.#velocityY },\n };\n\n if (this.#collider.type === 'rect') this.#matterBody = Matter.Bodies.rectangle(x, y, this.#collider.width, this.#collider.height, bodyOpts);\n else if (this.#collider.type === 'circle') this.#matterBody = Matter.Bodies.circle(x, y, this.#collider.radius, bodyOpts);\n else if (this.#collider.type === 'vert') this.#matterBody = Matter.Bodies.fromVertices(x, y, [this.#collider.vertices], bodyOpts);\n else throw new Error('Invalid collider type');\n\n this.#matterBody.plugin.owner = this.#go;\n this.#lastScaleX = wt.scaleX.v;\n this.#lastScaleY = wt.scaleY.v;\n Matter.Body.scale(this.#matterBody, wt.scaleX.v, wt.scaleY.v);\n\n this.#initialInertia = this.#matterBody.inertia;\n if (this.#fixedRotation) {\n Matter.Body.setInertia(this.#matterBody, Infinity);\n Matter.Body.setAngularVelocity(this.#matterBody, 0);\n }\n\n world._worldPhysics.addBody(this.#matterBody);\n this.#setDebugRenderStyle();\n }\n\n applyChanges() {\n if (this.#collider && !this.#matterBody) this.#createBody();\n if (!this.#matterBody) return;\n\n const wt = this.#go._wt;\n const { x: ox, y: oy } = localOffsetToWorld(wt, this.#collider?.x ?? 0, this.#collider?.y ?? 0);\n\n if (wt.x.dirty || wt.scaleX.dirty || wt.y.dirty || wt.scaleY.dirty) {\n if ((wt.x.dirty || wt.scaleX.dirty) && (wt.y.dirty || wt.scaleY.dirty)) Matter.Body.setPosition(this.#matterBody, { x: wt.x.v + ox, y: wt.y.v + oy });\n else if (wt.x.dirty || wt.scaleX.dirty) Matter.Body.setPosition(this.#matterBody, { x: wt.x.v + ox, y: this.#matterBody.position.y });\n else if (wt.y.dirty || wt.scaleY.dirty) Matter.Body.setPosition(this.#matterBody, { x: this.#matterBody.position.x, y: wt.y.v + oy });\n }\n if (wt.scaleX.dirty || wt.scaleY.dirty) {\n const scaleDiffX = wt.scaleX.v / this.#lastScaleX;\n const scaleDiffY = wt.scaleY.v / this.#lastScaleY;\n Matter.Body.scale(this.#matterBody, scaleDiffX, scaleDiffY);\n this.#lastScaleX = wt.scaleX.v;\n this.#lastScaleY = wt.scaleY.v;\n }\n if (wt.rotation.dirty) Matter.Body.setAngle(this.#matterBody, wt.rotation.v);\n\n const lt = this.#go._lt;\n if (!wt.x.dirty || !wt.y.dirty || !wt.rotation.dirty) {\n const { x, y, rotation, newWorldX, newWorldY, newWorldRotation } =\n worldToLocalWithNewWorld(\n wt,\n lt,\n this.#matterBody.position.x - ox,\n this.#matterBody.position.y - oy,\n this.#matterBody.angle\n );\n if (!wt.x.dirty) { lt.x.v = x; wt.x.v = newWorldX; }\n if (!wt.y.dirty) { lt.y.v = y; wt.y.v = newWorldY; }\n if (!wt.rotation.dirty) { lt.rotation.v = rotation; wt.rotation.v = newWorldRotation; }\n }\n }\n\n destroy() {\n this.#removeBody();\n }\n\n get collider() { return this.#collider; }\n set collider(value: Collider | undefined) {\n this.#removeBody();\n this.#collider = value;\n }\n\n get isStatic() {\n if (this.#matterBody) return this.#matterBody.isStatic;\n else return this.#isStatic;\n }\n set isStatic(value: boolean) {\n this.#isStatic = value;\n if (this.#matterBody) Matter.Body.setStatic(this.#matterBody, value);\n this.#setDebugRenderStyle();\n }\n\n get isSensor() {\n if (this.#matterBody) return this.#matterBody.isSensor;\n else return this.#isSensor;\n }\n set isSensor(value: boolean) {\n this.#isSensor = value;\n if (this.#matterBody) this.#matterBody.isSensor = value;\n this.#setDebugRenderStyle();\n }\n\n get velocityX() {\n if (this.#matterBody) return this.#matterBody.velocity.x;\n else return this.#velocityX;\n }\n set velocityX(value: number) {\n this.#velocityX = value;\n if (this.#matterBody) Matter.Body.setVelocity(this.#matterBody, { x: value, y: this.#velocityY });\n }\n\n get velocityY() {\n if (this.#matterBody) return this.#matterBody.velocity.y;\n else return this.#velocityY;\n }\n set velocityY(value: number) {\n this.#velocityY = value;\n if (this.#matterBody) Matter.Body.setVelocity(this.#matterBody, { x: this.#velocityX, y: value });\n }\n\n get fixedRotation() { return this.#fixedRotation; }\n set fixedRotation(value: boolean) {\n this.#fixedRotation = value;\n if (this.#matterBody) {\n if (value) {\n Matter.Body.setInertia(this.#matterBody, Infinity);\n Matter.Body.setAngularVelocity(this.#matterBody, 0);\n } else {\n Matter.Body.setInertia(this.#matterBody, this.#initialInertia!);\n Matter.Body.setAngularVelocity(this.#matterBody, 0);\n }\n }\n }\n\n #setDebugRenderStyle() {\n if (!debugMode || !this.#matterBody) return;\n\n if (this.#isSensor) {\n this.#matterBody.render.fillStyle = 'rgba(255,255,0,0.1)';\n this.#matterBody.render.strokeStyle = 'rgba(255,255,0,0.25)';\n this.#matterBody.render.lineWidth = 1;\n }\n else if (this.#isStatic) {\n this.#matterBody.render.fillStyle = 'rgba(255,0,0,0.1)';\n this.#matterBody.render.strokeStyle = 'rgba(255,0,0,0.25)';\n this.#matterBody.render.lineWidth = 1;\n }\n else {\n this.#matterBody.render.fillStyle = 'rgba(0,255,0,0.1)';\n this.#matterBody.render.strokeStyle = 'rgba(0,255,0,0.25)';\n this.#matterBody.render.lineWidth = 1;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
export class GameObjectRendering {
|
|
3
|
+
_container = new Container({ sortableChildren: true });
|
|
4
|
+
#yBasedDrawOrder = false;
|
|
5
|
+
addChild(child) { this._container.addChild(child._container); }
|
|
6
|
+
removeChild(child) { this._container.removeChild(child._container); }
|
|
7
|
+
destroy() { this._container.destroy({ children: true }); }
|
|
8
|
+
applyChanges(lt) {
|
|
9
|
+
if (lt.x.dirty)
|
|
10
|
+
this._container.x = lt.x.v;
|
|
11
|
+
if (lt.y.dirty) {
|
|
12
|
+
this._container.y = lt.y.v;
|
|
13
|
+
if (this.#yBasedDrawOrder)
|
|
14
|
+
this.drawOrder = lt.y.v;
|
|
15
|
+
}
|
|
16
|
+
if (lt.pivotX.dirty)
|
|
17
|
+
this._container.pivot.x = lt.pivotX.v;
|
|
18
|
+
if (lt.pivotY.dirty)
|
|
19
|
+
this._container.pivot.y = lt.pivotY.v;
|
|
20
|
+
if (lt.scaleX.dirty)
|
|
21
|
+
this._container.scale.x = lt.scaleX.v;
|
|
22
|
+
if (lt.scaleY.dirty)
|
|
23
|
+
this._container.scale.y = lt.scaleY.v;
|
|
24
|
+
if (lt.rotation.dirty)
|
|
25
|
+
this._container.rotation = lt.rotation.v;
|
|
26
|
+
if (lt.alpha.dirty)
|
|
27
|
+
this._container.alpha = lt.alpha.v;
|
|
28
|
+
}
|
|
29
|
+
get drawOrder() { return this._container.zIndex; }
|
|
30
|
+
set drawOrder(v) { this._container.zIndex = v; }
|
|
31
|
+
get yBasedDrawOrder() { return this.#yBasedDrawOrder; }
|
|
32
|
+
set yBasedDrawOrder(v) { this.#yBasedDrawOrder = v; if (v)
|
|
33
|
+
this.drawOrder = this._container.y; }
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=game-object-rendering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-object-rendering.js","sourceRoot":"","sources":["../../src/game-object/game-object-rendering.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,MAAM,OAAO,mBAAmB;IAC9B,UAAU,GAAG,IAAI,SAAS,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,gBAAgB,GAAG,KAAK,CAAC;IAEzB,QAAQ,CAAC,KAA0B,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACpF,WAAW,CAAC,KAA0B,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1D,YAAY,CAAC,EAAkB;QAC7B,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,IAAI,CAAC,gBAAgB;gBAAE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACnG,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChE,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,IAAI,SAAS,CAAC,CAAS,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,eAAe,KAAK,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACvD,IAAI,eAAe,CAAC,CAAU,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;CAC1G","sourcesContent":["import { Container } from 'pixi.js';\nimport { LocalTransform } from './transform';\n\nexport class GameObjectRendering {\n _container = new Container({ sortableChildren: true });\n #yBasedDrawOrder = false;\n\n addChild(child: GameObjectRendering) { this._container.addChild(child._container); }\n removeChild(child: GameObjectRendering) { this._container.removeChild(child._container); }\n destroy() { this._container.destroy({ children: true }); }\n\n applyChanges(lt: LocalTransform) {\n if (lt.x.dirty) this._container.x = lt.x.v;\n if (lt.y.dirty) { this._container.y = lt.y.v; if (this.#yBasedDrawOrder) this.drawOrder = lt.y.v; }\n if (lt.pivotX.dirty) this._container.pivot.x = lt.pivotX.v;\n if (lt.pivotY.dirty) this._container.pivot.y = lt.pivotY.v;\n if (lt.scaleX.dirty) this._container.scale.x = lt.scaleX.v;\n if (lt.scaleY.dirty) this._container.scale.y = lt.scaleY.v;\n if (lt.rotation.dirty) this._container.rotation = lt.rotation.v;\n if (lt.alpha.dirty) this._container.alpha = lt.alpha.v;\n }\n\n get drawOrder() { return this._container.zIndex; }\n set drawOrder(v: number) { this._container.zIndex = v; }\n get yBasedDrawOrder() { return this.#yBasedDrawOrder; }\n set yBasedDrawOrder(v: boolean) { this.#yBasedDrawOrder = v; if (v) this.drawOrder = this._container.y; }\n}\n"]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { EventEmitter } from '@webtaku/event-emitter';
|
|
2
|
+
import { Sprite } from 'pixi.js';
|
|
3
|
+
import { textureLoader } from '../asset/loaders/texture';
|
|
4
|
+
import { GameObjectPhysics } from './game-object-physics';
|
|
5
|
+
import { GameObjectRendering } from './game-object-rendering';
|
|
6
|
+
import { LocalTransform, WorldTransform } from './transform';
|
|
7
|
+
export class GameObject extends EventEmitter {
|
|
8
|
+
_lt = new LocalTransform();
|
|
9
|
+
_wt = new WorldTransform();
|
|
10
|
+
_rendering = new GameObjectRendering();
|
|
11
|
+
#physics = new GameObjectPhysics(this);
|
|
12
|
+
#world;
|
|
13
|
+
#parent;
|
|
14
|
+
#children = [];
|
|
15
|
+
data = {};
|
|
16
|
+
_setWorld(world) {
|
|
17
|
+
this.#world = world;
|
|
18
|
+
for (const child of this.#children) {
|
|
19
|
+
child._setWorld(world);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
_getWorld() { return this.#world; }
|
|
23
|
+
add(...children) {
|
|
24
|
+
for (const child of children) {
|
|
25
|
+
if (child.#parent) {
|
|
26
|
+
const idx = child.#parent.#children.indexOf(child);
|
|
27
|
+
if (idx !== -1)
|
|
28
|
+
child.#parent.#children.splice(idx, 1);
|
|
29
|
+
child.#parent._rendering.removeChild(child._rendering);
|
|
30
|
+
}
|
|
31
|
+
if (this.#world)
|
|
32
|
+
child._setWorld(this.#world);
|
|
33
|
+
child.#parent = this;
|
|
34
|
+
this.#children.push(child);
|
|
35
|
+
this._rendering.addChild(child._rendering);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
remove() {
|
|
39
|
+
if (this.#parent) {
|
|
40
|
+
const idx = this.#parent.#children.indexOf(this);
|
|
41
|
+
if (idx !== -1)
|
|
42
|
+
this.#parent.#children.splice(idx, 1);
|
|
43
|
+
this.#parent = undefined;
|
|
44
|
+
}
|
|
45
|
+
for (const child of this.#children) {
|
|
46
|
+
child.#parent = undefined;
|
|
47
|
+
child.remove();
|
|
48
|
+
}
|
|
49
|
+
this.#children.length = 0;
|
|
50
|
+
this._rendering.destroy();
|
|
51
|
+
this.#physics.destroy();
|
|
52
|
+
}
|
|
53
|
+
update(dt) { }
|
|
54
|
+
_afterRender() { }
|
|
55
|
+
_engineUpdate(dt, pt) {
|
|
56
|
+
this.update(dt);
|
|
57
|
+
this._wt.update(pt, this._lt);
|
|
58
|
+
this.#physics.applyChanges();
|
|
59
|
+
this._rendering.applyChanges(this._lt);
|
|
60
|
+
this._afterRender();
|
|
61
|
+
this._lt.markClean();
|
|
62
|
+
this.emit('update', dt);
|
|
63
|
+
for (const child of this.#children) {
|
|
64
|
+
child._engineUpdate(dt, this._wt);
|
|
65
|
+
}
|
|
66
|
+
this._wt.markClean();
|
|
67
|
+
}
|
|
68
|
+
constructor(opts) {
|
|
69
|
+
super();
|
|
70
|
+
if (opts) {
|
|
71
|
+
if (opts.x !== undefined)
|
|
72
|
+
this.x = opts.x;
|
|
73
|
+
if (opts.y !== undefined)
|
|
74
|
+
this.y = opts.y;
|
|
75
|
+
if (opts.pivotX !== undefined)
|
|
76
|
+
this.pivotX = opts.pivotX;
|
|
77
|
+
if (opts.pivotY !== undefined)
|
|
78
|
+
this.pivotY = opts.pivotY;
|
|
79
|
+
if (opts.scale !== undefined)
|
|
80
|
+
this.scale = opts.scale;
|
|
81
|
+
if (opts.scaleX !== undefined)
|
|
82
|
+
this.scaleX = opts.scaleX;
|
|
83
|
+
if (opts.scaleY !== undefined)
|
|
84
|
+
this.scaleY = opts.scaleY;
|
|
85
|
+
if (opts.rotation !== undefined)
|
|
86
|
+
this.rotation = opts.rotation;
|
|
87
|
+
if (opts.alpha !== undefined)
|
|
88
|
+
this.alpha = opts.alpha;
|
|
89
|
+
if (opts.drawOrder !== undefined)
|
|
90
|
+
this.drawOrder = opts.drawOrder;
|
|
91
|
+
if (opts.yBasedDrawOrder !== undefined)
|
|
92
|
+
this.yBasedDrawOrder = opts.yBasedDrawOrder;
|
|
93
|
+
if (opts.collider !== undefined)
|
|
94
|
+
this.collider = opts.collider;
|
|
95
|
+
if (opts.isStatic !== undefined)
|
|
96
|
+
this.isStatic = opts.isStatic;
|
|
97
|
+
if (opts.isSensor !== undefined)
|
|
98
|
+
this.isSensor = opts.isSensor;
|
|
99
|
+
if (opts.velocityX !== undefined)
|
|
100
|
+
this.velocityX = opts.velocityX;
|
|
101
|
+
if (opts.velocityY !== undefined)
|
|
102
|
+
this.velocityY = opts.velocityY;
|
|
103
|
+
if (opts.fixedRotation !== undefined)
|
|
104
|
+
this.fixedRotation = opts.fixedRotation;
|
|
105
|
+
if (opts.image !== undefined)
|
|
106
|
+
this.image = opts.image;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
get x() { return this._lt.x.v; }
|
|
110
|
+
set x(v) { this._lt.x.v = v; }
|
|
111
|
+
get y() { return this._lt.y.v; }
|
|
112
|
+
set y(v) { this._lt.y.v = v; }
|
|
113
|
+
get pivotX() { return this._lt.pivotX.v; }
|
|
114
|
+
set pivotX(v) { this._lt.pivotX.v = v; }
|
|
115
|
+
get pivotY() { return this._lt.pivotY.v; }
|
|
116
|
+
set pivotY(v) { this._lt.pivotY.v = v; }
|
|
117
|
+
get scale() { return this._lt.scaleX.v; }
|
|
118
|
+
set scale(v) { this._lt.scaleX.v = v; this._lt.scaleY.v = v; }
|
|
119
|
+
get scaleX() { return this._lt.scaleX.v; }
|
|
120
|
+
set scaleX(v) { this._lt.scaleX.v = v; }
|
|
121
|
+
get scaleY() { return this._lt.scaleY.v; }
|
|
122
|
+
set scaleY(v) { this._lt.scaleY.v = v; }
|
|
123
|
+
get rotation() { return this._lt.rotation.v; }
|
|
124
|
+
set rotation(v) { this._lt.rotation.v = v; }
|
|
125
|
+
get alpha() { return this._lt.alpha.v; }
|
|
126
|
+
set alpha(v) { this._lt.alpha.v = v; }
|
|
127
|
+
get drawOrder() { return this._rendering.drawOrder; }
|
|
128
|
+
set drawOrder(v) { this._rendering.drawOrder = v; }
|
|
129
|
+
get yBasedDrawOrder() { return this._rendering.yBasedDrawOrder; }
|
|
130
|
+
set yBasedDrawOrder(v) { this._rendering.yBasedDrawOrder = v; }
|
|
131
|
+
get collider() { return this.#physics.collider; }
|
|
132
|
+
set collider(v) { this.#physics.collider = v; }
|
|
133
|
+
get isStatic() { return this.#physics.isStatic; }
|
|
134
|
+
set isStatic(v) { this.#physics.isStatic = v; }
|
|
135
|
+
get isSensor() { return this.#physics.isSensor; }
|
|
136
|
+
set isSensor(v) { this.#physics.isSensor = v; }
|
|
137
|
+
get velocityX() { return this.#physics.velocityX; }
|
|
138
|
+
set velocityX(v) { this.#physics.velocityX = v; }
|
|
139
|
+
get velocityY() { return this.#physics.velocityY; }
|
|
140
|
+
set velocityY(v) { this.#physics.velocityY = v; }
|
|
141
|
+
get fixedRotation() { return this.#physics.fixedRotation; }
|
|
142
|
+
set fixedRotation(v) { this.#physics.fixedRotation = v; }
|
|
143
|
+
_addPixiChild(child) { this._rendering._container.addChild(child); }
|
|
144
|
+
#image;
|
|
145
|
+
get image() { return this.#image; }
|
|
146
|
+
set image(value) {
|
|
147
|
+
if (value) {
|
|
148
|
+
if (!textureLoader.checkLoaded(value)) {
|
|
149
|
+
console.info(`Image not preloaded. Loading now: ${value}`);
|
|
150
|
+
}
|
|
151
|
+
textureLoader.load(value).then((texture) => {
|
|
152
|
+
if (texture)
|
|
153
|
+
this._addPixiChild(new Sprite({
|
|
154
|
+
texture,
|
|
155
|
+
anchor: { x: 0.5, y: 0.5 },
|
|
156
|
+
zIndex: -999999,
|
|
157
|
+
}));
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=game-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-object.js","sourceRoot":"","sources":["../../src/game-object/game-object.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter, EventMap } from '@webtaku/event-emitter';\nimport { Container, Sprite } from 'pixi.js';\nimport { textureLoader } from '../asset/loaders/texture';\nimport { World } from '../world/world';\nimport { Collider, GameObjectPhysics } from './game-object-physics';\nimport { GameObjectRendering } from './game-object-rendering';\nimport { LocalTransform, WorldTransform } from './transform';\n\nexport class GameObject<E extends EventMap = EventMap> extends EventEmitter<E & {\n update: (dt: number) => void\n}> {\n _lt = new LocalTransform();\n _wt = new WorldTransform();\n\n _rendering = new GameObjectRendering();\n #physics = new GameObjectPhysics(this);\n\n #world?: World;\n #parent?: GameObject;\n #children: GameObject[] = [];\n\n data: Record<string, any> = {};\n\n protected _setWorld(world: World) {\n this.#world = world;\n for (const child of this.#children) {\n child._setWorld(world);\n }\n }\n _getWorld() { return this.#world; }\n\n add(...children: GameObject[]) {\n for (const child of children) {\n if (child.#parent) {\n const idx = child.#parent.#children.indexOf(child);\n if (idx !== -1) child.#parent.#children.splice(idx, 1);\n child.#parent._rendering.removeChild(child._rendering);\n }\n if (this.#world) child._setWorld(this.#world);\n child.#parent = this;\n\n this.#children.push(child);\n this._rendering.addChild(child._rendering);\n }\n }\n\n remove() {\n if (this.#parent) {\n const idx = this.#parent.#children.indexOf(this);\n if (idx !== -1) this.#parent.#children.splice(idx, 1);\n this.#parent = undefined;\n }\n\n for (const child of this.#children) {\n child.#parent = undefined;\n child.remove();\n }\n this.#children.length = 0;\n\n this._rendering.destroy();\n this.#physics.destroy();\n }\n\n protected update(dt: number): void { }\n\n protected _afterRender() { }\n _engineUpdate(dt: number, pt: WorldTransform) {\n this.update(dt);\n\n this._wt.update(pt, this._lt);\n this.#physics.applyChanges();\n this._rendering.applyChanges(this._lt);\n this._afterRender();\n this._lt.markClean();\n\n (this as any).emit('update', dt);\n\n for (const child of this.#children) {\n child._engineUpdate(dt, this._wt);\n }\n this._wt.markClean();\n }\n\n constructor(opts?: GameObjectOptions) {\n super();\n if (opts) {\n if (opts.x !== undefined) this.x = opts.x;\n if (opts.y !== undefined) this.y = opts.y;\n if (opts.pivotX !== undefined) this.pivotX = opts.pivotX;\n if (opts.pivotY !== undefined) this.pivotY = opts.pivotY;\n if (opts.scale !== undefined) this.scale = opts.scale;\n if (opts.scaleX !== undefined) this.scaleX = opts.scaleX;\n if (opts.scaleY !== undefined) this.scaleY = opts.scaleY;\n if (opts.rotation !== undefined) this.rotation = opts.rotation;\n if (opts.alpha !== undefined) this.alpha = opts.alpha;\n\n if (opts.drawOrder !== undefined) this.drawOrder = opts.drawOrder;\n if (opts.yBasedDrawOrder !== undefined) this.yBasedDrawOrder = opts.yBasedDrawOrder;\n\n if (opts.collider !== undefined) this.collider = opts.collider;\n if (opts.isStatic !== undefined) this.isStatic = opts.isStatic;\n if (opts.isSensor !== undefined) this.isSensor = opts.isSensor;\n if (opts.velocityX !== undefined) this.velocityX = opts.velocityX;\n if (opts.velocityY !== undefined) this.velocityY = opts.velocityY;\n if (opts.fixedRotation !== undefined) this.fixedRotation = opts.fixedRotation;\n\n if (opts.image !== undefined) this.image = opts.image;\n }\n }\n\n get x() { return this._lt.x.v; }\n set x(v: number) { this._lt.x.v = v; }\n get y() { return this._lt.y.v; }\n set y(v: number) { this._lt.y.v = v; }\n get pivotX() { return this._lt.pivotX.v; }\n set pivotX(v: number) { this._lt.pivotX.v = v; }\n get pivotY() { return this._lt.pivotY.v; }\n set pivotY(v: number) { this._lt.pivotY.v = v; }\n get scale() { return this._lt.scaleX.v; }\n set scale(v: number) { this._lt.scaleX.v = v; this._lt.scaleY.v = v; }\n get scaleX() { return this._lt.scaleX.v; }\n set scaleX(v: number) { this._lt.scaleX.v = v; }\n get scaleY() { return this._lt.scaleY.v; }\n set scaleY(v: number) { this._lt.scaleY.v = v; }\n get rotation() { return this._lt.rotation.v; }\n set rotation(v: number) { this._lt.rotation.v = v; }\n get alpha() { return this._lt.alpha.v; }\n set alpha(v: number) { this._lt.alpha.v = v; }\n\n get drawOrder() { return this._rendering.drawOrder; }\n set drawOrder(v: number) { this._rendering.drawOrder = v; }\n get yBasedDrawOrder() { return this._rendering.yBasedDrawOrder; }\n set yBasedDrawOrder(v: boolean) { this._rendering.yBasedDrawOrder = v; }\n\n get collider() { return this.#physics.collider; }\n set collider(v: Collider | undefined) { this.#physics.collider = v; }\n get isStatic() { return this.#physics.isStatic; }\n set isStatic(v: boolean) { this.#physics.isStatic = v; }\n get isSensor() { return this.#physics.isSensor; }\n set isSensor(v: boolean) { this.#physics.isSensor = v; }\n get velocityX() { return this.#physics.velocityX; }\n set velocityX(v: number) { this.#physics.velocityX = v; }\n get velocityY() { return this.#physics.velocityY; }\n set velocityY(v: number) { this.#physics.velocityY = v; }\n get fixedRotation() { return this.#physics.fixedRotation; }\n set fixedRotation(v: boolean) { this.#physics.fixedRotation = v; }\n\n _addPixiChild(child: Container) { this._rendering._container.addChild(child); }\n\n #image?: string;\n get image() { return this.#image; }\n set image(value: string | undefined) {\n if (value) {\n if (!textureLoader.checkLoaded(value)) {\n console.info(`Image not preloaded. Loading now: ${value}`);\n }\n textureLoader.load(value).then((texture) => {\n if (texture) this._addPixiChild(new Sprite({\n texture,\n anchor: { x: 0.5, y: 0.5 },\n zIndex: -999999,\n }));\n });\n }\n }\n}\n\nexport type GameObjectOptions = {\n x?: number;\n y?: number;\n pivotX?: number;\n pivotY?: number;\n scale?: number;\n scaleX?: number;\n scaleY?: number;\n rotation?: number;\n alpha?: number;\n\n drawOrder?: number;\n yBasedDrawOrder?: boolean;\n\n collider?: Collider;\n isStatic?: boolean;\n isSensor?: boolean;\n velocityX?: number;\n velocityY?: number;\n fixedRotation?: boolean;\n\n image?: string;\n};\n"]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
class DirtyNumber {
|
|
2
|
+
#v;
|
|
3
|
+
#dirty;
|
|
4
|
+
constructor(v) {
|
|
5
|
+
this.#v = v;
|
|
6
|
+
this.#dirty = false;
|
|
7
|
+
}
|
|
8
|
+
get dirty() {
|
|
9
|
+
return this.#dirty;
|
|
10
|
+
}
|
|
11
|
+
get v() {
|
|
12
|
+
return this.#v;
|
|
13
|
+
}
|
|
14
|
+
set v(v) {
|
|
15
|
+
if (this.#v !== v)
|
|
16
|
+
this.#dirty = true;
|
|
17
|
+
this.#v = v;
|
|
18
|
+
}
|
|
19
|
+
markClean() {
|
|
20
|
+
this.#dirty = false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class LocalTransform {
|
|
24
|
+
x = new DirtyNumber(0);
|
|
25
|
+
y = new DirtyNumber(0);
|
|
26
|
+
pivotX = new DirtyNumber(0);
|
|
27
|
+
pivotY = new DirtyNumber(0);
|
|
28
|
+
scaleX = new DirtyNumber(1);
|
|
29
|
+
scaleY = new DirtyNumber(1);
|
|
30
|
+
rotation = new DirtyNumber(0);
|
|
31
|
+
alpha = new DirtyNumber(1);
|
|
32
|
+
markClean() {
|
|
33
|
+
this.x.markClean();
|
|
34
|
+
this.y.markClean();
|
|
35
|
+
this.pivotX.markClean();
|
|
36
|
+
this.pivotY.markClean();
|
|
37
|
+
this.scaleX.markClean();
|
|
38
|
+
this.scaleY.markClean();
|
|
39
|
+
this.rotation.markClean();
|
|
40
|
+
this.alpha.markClean();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class WorldTransform {
|
|
44
|
+
x = new DirtyNumber(0);
|
|
45
|
+
y = new DirtyNumber(0);
|
|
46
|
+
scaleX = new DirtyNumber(1);
|
|
47
|
+
scaleY = new DirtyNumber(1);
|
|
48
|
+
rotation = new DirtyNumber(0);
|
|
49
|
+
alpha = new DirtyNumber(1);
|
|
50
|
+
update(parent, local) {
|
|
51
|
+
const rx = local.x.v * parent.scaleX.v;
|
|
52
|
+
const ry = local.y.v * parent.scaleY.v;
|
|
53
|
+
const pCos = Math.cos(parent.rotation.v);
|
|
54
|
+
const pSin = Math.sin(parent.rotation.v);
|
|
55
|
+
this.scaleX.v = parent.scaleX.v * local.scaleX.v;
|
|
56
|
+
this.scaleY.v = parent.scaleY.v * local.scaleY.v;
|
|
57
|
+
const pivotX = local.pivotX.v * this.scaleX.v;
|
|
58
|
+
const pivotY = local.pivotY.v * this.scaleY.v;
|
|
59
|
+
const cos = Math.cos(local.rotation.v);
|
|
60
|
+
const sin = Math.sin(local.rotation.v);
|
|
61
|
+
this.x.v = parent.x.v + (rx * pCos - ry * pSin) - (pivotX * cos - pivotY * sin);
|
|
62
|
+
this.y.v = parent.y.v + (rx * pSin + ry * pCos) - (pivotX * sin + pivotY * cos);
|
|
63
|
+
this.rotation.v = parent.rotation.v + local.rotation.v;
|
|
64
|
+
this.alpha.v = parent.alpha.v * local.alpha.v;
|
|
65
|
+
}
|
|
66
|
+
markClean() {
|
|
67
|
+
this.x.markClean();
|
|
68
|
+
this.y.markClean();
|
|
69
|
+
this.scaleX.markClean();
|
|
70
|
+
this.scaleY.markClean();
|
|
71
|
+
this.rotation.markClean();
|
|
72
|
+
this.alpha.markClean();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function localOffsetToWorld(world, ox, oy) {
|
|
76
|
+
const cos = Math.cos(world.rotation.v);
|
|
77
|
+
const sin = Math.sin(world.rotation.v);
|
|
78
|
+
const sx = ox * world.scaleX.v;
|
|
79
|
+
const sy = oy * world.scaleY.v;
|
|
80
|
+
const x = sx * cos - sy * sin;
|
|
81
|
+
const y = sx * sin + sy * cos;
|
|
82
|
+
return { x, y };
|
|
83
|
+
}
|
|
84
|
+
export function worldToLocalWithNewWorld(world, local, targetWorldX, targetWorldY, targetWorldRotation) {
|
|
85
|
+
const invLocalScaleX = local.scaleX.v !== 0 ? 1 / local.scaleX.v : 0;
|
|
86
|
+
const invLocalScaleY = local.scaleY.v !== 0 ? 1 / local.scaleY.v : 0;
|
|
87
|
+
const parentScaleX = world.scaleX.v * invLocalScaleX;
|
|
88
|
+
const parentScaleY = world.scaleY.v * invLocalScaleY;
|
|
89
|
+
const parentRot = world.rotation.v - local.rotation.v;
|
|
90
|
+
const pCos = Math.cos(parentRot);
|
|
91
|
+
const pSin = Math.sin(parentRot);
|
|
92
|
+
const cosOld = Math.cos(local.rotation.v);
|
|
93
|
+
const sinOld = Math.sin(local.rotation.v);
|
|
94
|
+
const pivotX = local.pivotX.v * world.scaleX.v;
|
|
95
|
+
const pivotY = local.pivotY.v * world.scaleY.v;
|
|
96
|
+
const rx0 = local.x.v * parentScaleX;
|
|
97
|
+
const ry0 = local.y.v * parentScaleY;
|
|
98
|
+
const parentX = world.x.v - (rx0 * pCos - ry0 * pSin) + (pivotX * cosOld - pivotY * sinOld);
|
|
99
|
+
const parentY = world.y.v - (rx0 * pSin + ry0 * pCos) + (pivotX * sinOld + pivotY * cosOld);
|
|
100
|
+
const rotation = targetWorldRotation - parentRot;
|
|
101
|
+
const cosNew = Math.cos(rotation);
|
|
102
|
+
const sinNew = Math.sin(rotation);
|
|
103
|
+
const tx = (targetWorldX - parentX) + (pivotX * cosNew - pivotY * sinNew);
|
|
104
|
+
const ty = (targetWorldY - parentY) + (pivotX * sinNew + pivotY * cosNew);
|
|
105
|
+
const rx = tx * pCos + ty * pSin;
|
|
106
|
+
const ry = -tx * pSin + ty * pCos;
|
|
107
|
+
const invParentScaleX = parentScaleX !== 0 ? 1 / parentScaleX : 0;
|
|
108
|
+
const invParentScaleY = parentScaleY !== 0 ? 1 / parentScaleY : 0;
|
|
109
|
+
const x = rx * invParentScaleX;
|
|
110
|
+
const y = ry * invParentScaleY;
|
|
111
|
+
const newRx = x * parentScaleX;
|
|
112
|
+
const newRy = y * parentScaleY;
|
|
113
|
+
const newWorldX = parentX + (newRx * pCos - newRy * pSin) - (pivotX * cosNew - pivotY * sinNew);
|
|
114
|
+
const newWorldY = parentY + (newRx * pSin + newRy * pCos) - (pivotX * sinNew + pivotY * cosNew);
|
|
115
|
+
const newWorldRotation = parentRot + rotation;
|
|
116
|
+
return { x, y, rotation, newWorldX, newWorldY, newWorldRotation };
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=transform.js.map
|