kiwiengine 0.0.1-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -0
  3. package/assets/logo.png +0 -0
  4. package/examples/package.json +13 -0
  5. package/examples/test-dom/index.html +24 -0
  6. package/examples/test-dom/index.ts +21 -0
  7. package/examples/tsconfig.json +22 -0
  8. package/examples/webpack.config.js +31 -0
  9. package/lib/asset/audio.js +158 -0
  10. package/lib/asset/audio.js.map +1 -0
  11. package/lib/asset/loaders/audio.js +35 -0
  12. package/lib/asset/loaders/audio.js.map +1 -0
  13. package/lib/asset/loaders/binary.js +28 -0
  14. package/lib/asset/loaders/binary.js.map +1 -0
  15. package/lib/asset/loaders/font.js +27 -0
  16. package/lib/asset/loaders/font.js.map +1 -0
  17. package/lib/asset/loaders/loader.js +37 -0
  18. package/lib/asset/loaders/loader.js.map +1 -0
  19. package/lib/asset/loaders/spritesheet.js +56 -0
  20. package/lib/asset/loaders/spritesheet.js.map +1 -0
  21. package/lib/asset/loaders/text.js +27 -0
  22. package/lib/asset/loaders/text.js.map +1 -0
  23. package/lib/asset/loaders/texture.js +38 -0
  24. package/lib/asset/loaders/texture.js.map +1 -0
  25. package/lib/asset/preload.js +69 -0
  26. package/lib/asset/preload.js.map +1 -0
  27. package/lib/game-object/game-object-physics.js +188 -0
  28. package/lib/game-object/game-object-physics.js.map +1 -0
  29. package/lib/game-object/game-object-rendering.js +35 -0
  30. package/lib/game-object/game-object-rendering.js.map +1 -0
  31. package/lib/game-object/game-object.js +162 -0
  32. package/lib/game-object/game-object.js.map +1 -0
  33. package/lib/game-object/transform.js +118 -0
  34. package/lib/game-object/transform.js.map +1 -0
  35. package/lib/game-object-ext/animated-sprite.js +117 -0
  36. package/lib/game-object-ext/animated-sprite.js.map +1 -0
  37. package/lib/game-object-ext/dom-container.js +56 -0
  38. package/lib/game-object-ext/dom-container.js.map +1 -0
  39. package/lib/game-object-ext/rect.js +30 -0
  40. package/lib/game-object-ext/rect.js.map +1 -0
  41. package/lib/game-object-ext/spine.js +206 -0
  42. package/lib/game-object-ext/spine.js.map +1 -0
  43. package/lib/game-object-ext/sprite.js +46 -0
  44. package/lib/game-object-ext/sprite.js.map +1 -0
  45. package/lib/game-object-ext/text.js +68 -0
  46. package/lib/game-object-ext/text.js.map +1 -0
  47. package/lib/game-object-ext/tiling-sprite.js +64 -0
  48. package/lib/game-object-ext/tiling-sprite.js.map +1 -0
  49. package/lib/index.js +13 -0
  50. package/lib/index.js.map +1 -0
  51. package/lib/types/asset/audio.d.ts +21 -0
  52. package/lib/types/asset/audio.d.ts.map +1 -0
  53. package/lib/types/asset/loaders/audio.d.ts +7 -0
  54. package/lib/types/asset/loaders/audio.d.ts.map +1 -0
  55. package/lib/types/asset/loaders/binary.d.ts +7 -0
  56. package/lib/types/asset/loaders/binary.d.ts.map +1 -0
  57. package/lib/types/asset/loaders/font.d.ts +7 -0
  58. package/lib/types/asset/loaders/font.d.ts.map +1 -0
  59. package/lib/types/asset/loaders/loader.d.ts +13 -0
  60. package/lib/types/asset/loaders/loader.d.ts.map +1 -0
  61. package/lib/types/asset/loaders/spritesheet.d.ts +11 -0
  62. package/lib/types/asset/loaders/spritesheet.d.ts.map +1 -0
  63. package/lib/types/asset/loaders/text.d.ts +7 -0
  64. package/lib/types/asset/loaders/text.d.ts.map +1 -0
  65. package/lib/types/asset/loaders/texture.d.ts +9 -0
  66. package/lib/types/asset/loaders/texture.d.ts.map +1 -0
  67. package/lib/types/asset/preload.d.ts +8 -0
  68. package/lib/types/asset/preload.d.ts.map +1 -0
  69. package/lib/types/game-object/game-object-physics.d.ts +42 -0
  70. package/lib/types/game-object/game-object-physics.d.ts.map +1 -0
  71. package/lib/types/game-object/game-object-rendering.d.ts +15 -0
  72. package/lib/types/game-object/game-object-rendering.d.ts.map +1 -0
  73. package/lib/types/game-object/game-object.d.ts +81 -0
  74. package/lib/types/game-object/game-object.d.ts.map +1 -0
  75. package/lib/types/game-object/transform.d.ts +43 -0
  76. package/lib/types/game-object/transform.d.ts.map +1 -0
  77. package/lib/types/game-object-ext/animated-sprite.d.ts +29 -0
  78. package/lib/types/game-object-ext/animated-sprite.d.ts.map +1 -0
  79. package/lib/types/game-object-ext/dom-container.d.ts +16 -0
  80. package/lib/types/game-object-ext/dom-container.d.ts.map +1 -0
  81. package/lib/types/game-object-ext/rect.d.ts +17 -0
  82. package/lib/types/game-object-ext/rect.d.ts.map +1 -0
  83. package/lib/types/game-object-ext/spine.d.ts +35 -0
  84. package/lib/types/game-object-ext/spine.d.ts.map +1 -0
  85. package/lib/types/game-object-ext/sprite.d.ts +14 -0
  86. package/lib/types/game-object-ext/sprite.d.ts.map +1 -0
  87. package/lib/types/game-object-ext/text.d.ts +26 -0
  88. package/lib/types/game-object-ext/text.d.ts.map +1 -0
  89. package/lib/types/game-object-ext/tiling-sprite.d.ts +20 -0
  90. package/lib/types/game-object-ext/tiling-sprite.d.ts.map +1 -0
  91. package/lib/types/index.d.ts +14 -0
  92. package/lib/types/index.d.ts.map +1 -0
  93. package/lib/types/utils/debug.d.ts +3 -0
  94. package/lib/types/utils/debug.d.ts.map +1 -0
  95. package/lib/types/utils/go.d.ts +26 -0
  96. package/lib/types/utils/go.d.ts.map +1 -0
  97. package/lib/types/world/world-debug.d.ts +11 -0
  98. package/lib/types/world/world-debug.d.ts.map +1 -0
  99. package/lib/types/world/world-physics.d.ts +16 -0
  100. package/lib/types/world/world-physics.d.ts.map +1 -0
  101. package/lib/types/world/world-rendering.d.ts +28 -0
  102. package/lib/types/world/world-rendering.d.ts.map +1 -0
  103. package/lib/types/world/world.d.ts +38 -0
  104. package/lib/types/world/world.d.ts.map +1 -0
  105. package/lib/utils/debug.js +5 -0
  106. package/lib/utils/debug.js.map +1 -0
  107. package/lib/utils/go.js +33 -0
  108. package/lib/utils/go.js.map +1 -0
  109. package/lib/world/world-debug.js +89 -0
  110. package/lib/world/world-debug.js.map +1 -0
  111. package/lib/world/world-physics.js +45 -0
  112. package/lib/world/world-physics.js.map +1 -0
  113. package/lib/world/world-rendering.js +123 -0
  114. package/lib/world/world-rendering.js.map +1 -0
  115. package/lib/world/world.js +147 -0
  116. package/lib/world/world.js.map +1 -0
  117. package/package.json +23 -0
  118. package/src/asset/audio.ts +176 -0
  119. package/src/asset/loaders/audio.ts +39 -0
  120. package/src/asset/loaders/binary.ts +32 -0
  121. package/src/asset/loaders/font.ts +27 -0
  122. package/src/asset/loaders/loader.ts +39 -0
  123. package/src/asset/loaders/spritesheet.ts +67 -0
  124. package/src/asset/loaders/text.ts +31 -0
  125. package/src/asset/loaders/texture.ts +46 -0
  126. package/src/asset/preload.ts +76 -0
  127. package/src/game-object/game-object-physics.ts +191 -0
  128. package/src/game-object/game-object-rendering.ts +27 -0
  129. package/src/game-object/game-object.ts +190 -0
  130. package/src/game-object/transform.ts +164 -0
  131. package/src/game-object-ext/animated-sprite.ts +140 -0
  132. package/src/game-object-ext/dom-container.ts +67 -0
  133. package/src/game-object-ext/rect.ts +40 -0
  134. package/src/game-object-ext/spine.ts +235 -0
  135. package/src/game-object-ext/sprite.ts +55 -0
  136. package/src/game-object-ext/text.ts +83 -0
  137. package/src/game-object-ext/tiling-sprite.ts +73 -0
  138. package/src/index.ts +14 -0
  139. package/src/utils/debug.ts +5 -0
  140. package/src/utils/go.ts +53 -0
  141. package/src/world/world-debug.ts +114 -0
  142. package/src/world/world-physics.ts +52 -0
  143. package/src/world/world-rendering.ts +145 -0
  144. package/src/world/world.ts +171 -0
  145. package/tsconfig.json +33 -0
@@ -0,0 +1,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