@safe-engine/pixi 8.4.7 → 8.5.4
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/README.md +17 -25
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +0 -23
- package/dist/box2d-wasm/ContactListener.d.ts +1 -1
- package/dist/box2d-wasm/ContactListener.d.ts.map +1 -1
- package/dist/box2d-wasm/ContactListener.js +50 -18
- package/dist/box2d-wasm/PhysicsComponent.d.ts +27 -30
- package/dist/box2d-wasm/PhysicsComponent.d.ts.map +1 -1
- package/dist/box2d-wasm/PhysicsComponent.js +44 -11
- package/dist/box2d-wasm/PhysicsSprite.d.ts +3 -0
- package/dist/box2d-wasm/PhysicsSprite.d.ts.map +1 -1
- package/dist/box2d-wasm/PhysicsSprite.js +24 -3
- package/dist/box2d-wasm/PhysicsSystem.d.ts +5 -3
- package/dist/box2d-wasm/PhysicsSystem.d.ts.map +1 -1
- package/dist/box2d-wasm/PhysicsSystem.js +135 -45
- package/dist/collider/CollideComponent.d.ts +27 -10
- package/dist/collider/CollideComponent.d.ts.map +1 -1
- package/dist/collider/CollideComponent.js +10 -12
- package/dist/collider/helper/Intersection.d.ts +6 -6
- package/dist/collider/helper/Intersection.d.ts.map +1 -1
- package/dist/collider/helper/Intersection.js +4 -4
- package/dist/collider/index.d.ts +1 -0
- package/dist/collider/index.d.ts.map +1 -1
- package/dist/collider/index.js +1 -0
- package/dist/components/NodeComp.d.ts +62 -36
- package/dist/components/NodeComp.d.ts.map +1 -1
- package/dist/components/NodeComp.js +18 -99
- package/dist/core/Color.d.ts.map +1 -1
- package/dist/dragonbones/DragonBonesComponent.d.ts +3 -2
- package/dist/dragonbones/DragonBonesComponent.d.ts.map +1 -1
- package/dist/dragonbones/DragonBonesComponent.js +1 -1
- package/dist/dragonbones/DragonBonesSystem.js +2 -2
- package/dist/gui/GUISystem.d.ts.map +1 -1
- package/dist/gui/GUISystem.js +5 -6
- package/dist/helper/utils.d.ts +0 -6
- package/dist/helper/utils.d.ts.map +1 -1
- package/dist/helper/utils.js +0 -12
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -5
- package/dist/norender/NoRenderComponent.d.ts +5 -1
- package/dist/norender/NoRenderComponent.d.ts.map +1 -1
- package/dist/norender/NoRenderSystem.d.ts.map +1 -1
- package/dist/norender/NoRenderSystem.js +8 -9
- package/dist/render/RenderComponent.d.ts +6 -17
- package/dist/render/RenderComponent.d.ts.map +1 -1
- package/dist/render/RenderComponent.js +26 -18
- package/dist/spine/lib/require-shim.d.ts.map +1 -1
- package/dist/spine/lib/require-shim.js +1 -1
- package/package.json +6 -7
- package/.github/workflows/npm-publish.yml +0 -35
- package/src/app.ts +0 -91
- package/src/base/EnhancedComponent.ts +0 -38
- package/src/base/gworld.ts +0 -20
- package/src/base/index.ts +0 -14
- package/src/base/utils.ts +0 -23
- package/src/box2d-wasm/ContactListener.ts +0 -66
- package/src/box2d-wasm/PhysicsComponent.ts +0 -83
- package/src/box2d-wasm/PhysicsSprite.ts +0 -42
- package/src/box2d-wasm/PhysicsSystem.ts +0 -142
- package/src/box2d-wasm/debugDraw.ts +0 -249
- package/src/box2d-wasm/index.ts +0 -19
- package/src/collider/CollideComponent.ts +0 -257
- package/src/collider/CollideSystem.ts +0 -166
- package/src/collider/helper/Intersection.ts +0 -139
- package/src/collider/helper/utils.ts +0 -37
- package/src/collider/index.ts +0 -16
- package/src/components/BaseComponent.ts +0 -17
- package/src/components/NodeComp.ts +0 -442
- package/src/components/Scene.ts +0 -17
- package/src/core/Color.ts +0 -7
- package/src/core/LoadingBar.ts +0 -63
- package/src/core/NodePool.ts +0 -28
- package/src/core/Size.ts +0 -21
- package/src/core/Vec2.ts +0 -108
- package/src/core/director.ts +0 -11
- package/src/core/index.ts +0 -7
- package/src/core/loader.ts +0 -14
- package/src/core/math.ts +0 -22
- package/src/dragonbones/DragonBonesComponent.ts +0 -32
- package/src/dragonbones/DragonBonesSystem.ts +0 -35
- package/src/dragonbones/index.ts +0 -11
- package/src/gui/GUIComponent.ts +0 -155
- package/src/gui/GUISystem.ts +0 -125
- package/src/helper/utils.ts +0 -50
- package/src/index.ts +0 -21
- package/src/norender/NoRenderComponent.ts +0 -60
- package/src/norender/NoRenderSystem.ts +0 -67
- package/src/norender/Touch.ts +0 -37
- package/src/planck/PhysicsComponent.ts +0 -83
- package/src/planck/PhysicsSprite.ts +0 -43
- package/src/planck/PhysicsSystem.ts +0 -201
- package/src/planck/index.ts +0 -3
- package/src/render/RenderComponent.ts +0 -132
- package/src/render/RenderSystem.ts +0 -64
- package/src/richtext/RichTextComp.ts +0 -50
- package/src/richtext/RichTextSystem.ts +0 -26
- package/src/richtext/html-text-parser.ts +0 -87
- package/src/richtext/index.ts +0 -8
- package/src/spine/SpineComponent.ts +0 -18
- package/src/spine/SpineSystem.ts +0 -30
- package/src/spine/index.ts +0 -11
- package/src/spine/lib/BatchableSpineSlot.ts +0 -138
- package/src/spine/lib/Spine.ts +0 -894
- package/src/spine/lib/SpineDebugRenderer.ts +0 -615
- package/src/spine/lib/SpinePipe.ts +0 -203
- package/src/spine/lib/SpineTexture.ts +0 -143
- package/src/spine/lib/assets/atlasLoader.ts +0 -158
- package/src/spine/lib/assets/skeletonLoader.ts +0 -81
- package/src/spine/lib/darktint/DarkTintBatchGeometry.ts +0 -92
- package/src/spine/lib/darktint/DarkTintBatcher.ts +0 -186
- package/src/spine/lib/darktint/DarkTintShader.ts +0 -74
- package/src/spine/lib/darktint/darkTintBit.ts +0 -77
- package/src/spine/lib/index.ts +0 -43
- package/src/spine/lib/require-shim.ts +0 -43
- package/tsconfig.json +0 -18
- /package/{src/@types → @types}/index.d.ts +0 -0
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import { Graphics } from 'pixi.js'
|
|
2
|
-
|
|
3
|
-
import { Color4B } from '..'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Forked from Box2D.js
|
|
7
|
-
* @see https://github.com/kripken/box2d.js/blob/f75077b/helpers/embox2d-helpers.js
|
|
8
|
-
* @author dmagunov + Huy Nguyen + fork contributions from Alex Birch
|
|
9
|
-
* @see https://github.com/kripken/box2d.js/blob/49dddd6/helpers/embox2d-html5canvas-debugDraw.js
|
|
10
|
-
* @author dmagunov + fork contributions from Alex Birch
|
|
11
|
-
* @license Zlib https://opensource.org/licenses/Zlib
|
|
12
|
-
* License evidence: https://github.com/kripken/box2d.js/blob/master/README.markdown#box2djs
|
|
13
|
-
* "box2d.js is zlib licensed, just like Box2D."
|
|
14
|
-
*
|
|
15
|
-
* @typedef {import('box2d-wasm')} Box2DFactory
|
|
16
|
-
* @param {CanvasRenderingContext2D} ctx
|
|
17
|
-
* @param {number} pixelsPerMeter
|
|
18
|
-
* @param {typeof Box2D & EmscriptenModule} box2D
|
|
19
|
-
*/
|
|
20
|
-
export const makeDebugDraw = (graphics: Graphics, pixelsPerMeter, box2D: typeof Box2D) => {
|
|
21
|
-
const {
|
|
22
|
-
b2Color,
|
|
23
|
-
b2Draw: { e_shapeBit },
|
|
24
|
-
b2Transform,
|
|
25
|
-
b2Vec2,
|
|
26
|
-
JSDraw,
|
|
27
|
-
wrapPointer,
|
|
28
|
-
} = box2D
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* to replace original C++ operator =
|
|
32
|
-
* @param {Box2D.b2Vec2} vec
|
|
33
|
-
* @returns {Box2D.b2Vec2}
|
|
34
|
-
*/
|
|
35
|
-
const copyVec2 = (vec: Box2D.b2Vec2) => new b2Vec2(vec.get_x(), vec.get_y())
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* to replace original C++ operator *= (float)
|
|
39
|
-
* @param {Box2D.b2Vec2} vec
|
|
40
|
-
* @param {number} scale
|
|
41
|
-
* @returns {Box2D.b2Vec2}
|
|
42
|
-
*/
|
|
43
|
-
const scaledVec2 = (vec: Box2D.b2Vec2, scale: number) => new b2Vec2(scale * vec.get_x(), scale * vec.get_y())
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* @param {Box2D.b2Color} color
|
|
47
|
-
* @returns {string}
|
|
48
|
-
*/
|
|
49
|
-
const getRgbStr = (color: Box2D.b2Color) => {
|
|
50
|
-
const red = (color.get_r() * 255) | 0
|
|
51
|
-
const green = (color.get_g() * 255) | 0
|
|
52
|
-
const blue = (color.get_b() * 255) | 0
|
|
53
|
-
return Color4B(red, green, blue, 0.1)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* @param {string} rgbStr
|
|
58
|
-
* @returns {void}
|
|
59
|
-
*/
|
|
60
|
-
const setCtxColor = (rgbStr: Color4B) => {
|
|
61
|
-
graphics.fillStyle = rgbStr
|
|
62
|
-
graphics.strokeStyle = { color: rgbStr }
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* @param {Box2D.b2Vec2[]} vertices
|
|
67
|
-
* @param {boolean} fill
|
|
68
|
-
* @returns {void}
|
|
69
|
-
*/
|
|
70
|
-
const drawPolygon = (vertices, fill) => {
|
|
71
|
-
// console.log("drawPolygon", vertices[0].y, fill);
|
|
72
|
-
// graphics.poly(vertices, fill)
|
|
73
|
-
graphics.moveTo(vertices[vertices.length - 1].x * pixelsPerMeter, vertices[vertices.length - 1].y * pixelsPerMeter)
|
|
74
|
-
vertices.forEach((v) => {
|
|
75
|
-
graphics.lineTo(v.x * pixelsPerMeter, v.y * pixelsPerMeter)
|
|
76
|
-
})
|
|
77
|
-
graphics.fill()
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* @param {Box2D.b2Vec2} center
|
|
82
|
-
* @param {number} radius
|
|
83
|
-
* @param {Box2D.b2Vec2} axis
|
|
84
|
-
* @param {boolean} fill
|
|
85
|
-
* @returns {void}
|
|
86
|
-
*/
|
|
87
|
-
const drawCircle = (center, radius, axis, fill) => {
|
|
88
|
-
// graphics.circle(center.x, center.y, radius)
|
|
89
|
-
let angle = 0
|
|
90
|
-
const angleStep = 32
|
|
91
|
-
const n = 360 / angleStep
|
|
92
|
-
let x = radius * Math.cos((angle * Math.PI) / 180)
|
|
93
|
-
let y = radius * Math.sin((angle * Math.PI) / 180)
|
|
94
|
-
graphics.moveTo(center.x + x, center.y + y)
|
|
95
|
-
angle += angleStep
|
|
96
|
-
|
|
97
|
-
for (let i = 0; i < n; i++) {
|
|
98
|
-
x = radius * Math.cos((angle * Math.PI) / 180)
|
|
99
|
-
y = radius * Math.sin((angle * Math.PI) / 180)
|
|
100
|
-
graphics.lineTo(center.x + x, center.y + y)
|
|
101
|
-
angle += angleStep
|
|
102
|
-
}
|
|
103
|
-
graphics.fill()
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* @param {Box2D.b2Vec2} vert1
|
|
108
|
-
* @param {Box2D.b2Vec2} vert2
|
|
109
|
-
* @returns {void}
|
|
110
|
-
*/
|
|
111
|
-
const drawSegment = (vert1, vert2) => {
|
|
112
|
-
// console.log("drawSegment", vert1, vert2)
|
|
113
|
-
graphics.moveTo(vert1.get_x(), vert1.get_y())
|
|
114
|
-
graphics.lineTo(vert2.get_x(), vert2.get_y())
|
|
115
|
-
graphics.stroke()
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* @param {Box2D.b2Vec2} vertex
|
|
120
|
-
* @param {number} sizeMetres
|
|
121
|
-
* @returns {void}
|
|
122
|
-
*/
|
|
123
|
-
const drawPoint = (vertex, sizeMetres) => {
|
|
124
|
-
const sizePixels = sizeMetres / pixelsPerMeter
|
|
125
|
-
graphics.rect(vertex.get_x() - sizePixels / 2, vertex.get_y() - sizePixels / 2, sizePixels, sizePixels)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* @param {Box2D.b2Transform} transform
|
|
130
|
-
* @param {number} sizeMetres
|
|
131
|
-
* @returns {void}
|
|
132
|
-
*/
|
|
133
|
-
const drawTransform = (transform: Box2D.b2Transform) => {
|
|
134
|
-
const pos = transform.get_p()
|
|
135
|
-
const rot = transform.get_q()
|
|
136
|
-
|
|
137
|
-
graphics.save()
|
|
138
|
-
graphics.translateTransform(pos.get_x(), pos.get_y())
|
|
139
|
-
graphics.scaleTransform(0.5, 0.5)
|
|
140
|
-
graphics.rotateTransform(rot.GetAngle())
|
|
141
|
-
// graphics.lineWidth *= 2;
|
|
142
|
-
graphics.restore()
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/** {@link Box2D.b2Vec2} is a struct of `float x, y` */
|
|
146
|
-
const sizeOfB2Vec = Float32Array.BYTES_PER_ELEMENT * 2
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* @param {number} array_p pointer to {@link Box2D.b2Vec2}
|
|
150
|
-
* @param {number} numElements length of array
|
|
151
|
-
* @param {number} sizeOfElement size of an instance of the array element
|
|
152
|
-
* @param {typeof Box2D.b2Vec2} ctor constructor for the array element
|
|
153
|
-
* @return {Box2D.b2Vec2[]}
|
|
154
|
-
*/
|
|
155
|
-
const reifyArray = (array_p, numElements, sizeOfElement, ctor) =>
|
|
156
|
-
Array(numElements)
|
|
157
|
-
.fill(undefined)
|
|
158
|
-
.map((_, index) => wrapPointer(array_p + index * sizeOfElement, ctor))
|
|
159
|
-
|
|
160
|
-
const debugDraw = Object.assign(new JSDraw(), {
|
|
161
|
-
/**
|
|
162
|
-
* @param {number} vert1_p pointer to {@link Box2D.b2Vec2}
|
|
163
|
-
* @param {number} vert2_p pointer to {@link Box2D.b2Vec2}
|
|
164
|
-
* @param {number} color_p pointer to {@link Box2D.b2Color}
|
|
165
|
-
* @returns {void}
|
|
166
|
-
*/
|
|
167
|
-
DrawSegment(vert1_p, vert2_p, color_p) {
|
|
168
|
-
const color = wrapPointer(color_p, b2Color)
|
|
169
|
-
setCtxColor(getRgbStr(color))
|
|
170
|
-
const vert1 = wrapPointer(vert1_p, b2Vec2)
|
|
171
|
-
const vert2 = wrapPointer(vert2_p, b2Vec2)
|
|
172
|
-
drawSegment(vert1, vert2)
|
|
173
|
-
},
|
|
174
|
-
/**
|
|
175
|
-
* @param {number} vertices_p pointer to Array<{@link Box2D.b2Vec2}>
|
|
176
|
-
* @param {number} vertexCount
|
|
177
|
-
* @param {number} color_p pointer to {@link Box2D.b2Color}
|
|
178
|
-
* @returns {void}
|
|
179
|
-
*/
|
|
180
|
-
DrawPolygon(vertices_p, vertexCount, color_p) {
|
|
181
|
-
const color = wrapPointer(color_p, b2Color)
|
|
182
|
-
setCtxColor(getRgbStr(color))
|
|
183
|
-
const vertices = reifyArray(vertices_p, vertexCount, sizeOfB2Vec, b2Vec2)
|
|
184
|
-
drawPolygon(vertices, false)
|
|
185
|
-
// console.log(`DrawPolygon`, getRgbStr(color).green, vertices[0].y)
|
|
186
|
-
},
|
|
187
|
-
/**
|
|
188
|
-
* @param {number} vertices_p pointer to Array<{@link Box2D.b2Vec2}>
|
|
189
|
-
* @param {number} vertexCount
|
|
190
|
-
* @param {number} color_p pointer to {@link Box2D.b2Color}
|
|
191
|
-
* @returns {void}
|
|
192
|
-
*/
|
|
193
|
-
DrawSolidPolygon(vertices_p, vertexCount, color_p) {
|
|
194
|
-
const color = wrapPointer(color_p, b2Color)
|
|
195
|
-
setCtxColor(getRgbStr(color))
|
|
196
|
-
const vertices = reifyArray(vertices_p, vertexCount, sizeOfB2Vec, b2Vec2)
|
|
197
|
-
drawPolygon(vertices, true)
|
|
198
|
-
},
|
|
199
|
-
/**
|
|
200
|
-
* @param {number} center_p pointer to {@link Box2D.b2Vec2}
|
|
201
|
-
* @param {number} radius
|
|
202
|
-
* @param {number} color_p pointer to {@link Box2D.b2Color}
|
|
203
|
-
* @returns {void}
|
|
204
|
-
*/
|
|
205
|
-
DrawCircle(center_p, radius, color_p) {
|
|
206
|
-
const color = wrapPointer(color_p, b2Color)
|
|
207
|
-
setCtxColor(getRgbStr(color))
|
|
208
|
-
const center = wrapPointer(center_p, b2Vec2)
|
|
209
|
-
const dummyAxis = new b2Vec2(0, 0)
|
|
210
|
-
drawCircle(center, radius, dummyAxis, false)
|
|
211
|
-
},
|
|
212
|
-
/**
|
|
213
|
-
* @param {number} center_p pointer to {@link Box2D.b2Vec2}
|
|
214
|
-
* @param {number} radius
|
|
215
|
-
* @param {number} axis_p pointer to {@link Box2D.b2Vec2}
|
|
216
|
-
* @param {number} color_p pointer to {@link Box2D.b2Color}
|
|
217
|
-
* @returns {void}
|
|
218
|
-
*/
|
|
219
|
-
DrawSolidCircle(center_p, radius, axis_p, color_p) {
|
|
220
|
-
const color = wrapPointer(color_p, b2Color)
|
|
221
|
-
setCtxColor(getRgbStr(color))
|
|
222
|
-
const center = wrapPointer(center_p, b2Vec2)
|
|
223
|
-
const axis = wrapPointer(axis_p, b2Vec2)
|
|
224
|
-
drawCircle(center, radius, axis, true)
|
|
225
|
-
},
|
|
226
|
-
/**
|
|
227
|
-
* @param {number} transform_p pointer to {@link Box2D.b2Transform}
|
|
228
|
-
* @returns {void}
|
|
229
|
-
*/
|
|
230
|
-
DrawTransform(transform_p) {
|
|
231
|
-
const transform = wrapPointer(transform_p, b2Transform)
|
|
232
|
-
drawTransform(transform)
|
|
233
|
-
},
|
|
234
|
-
/**
|
|
235
|
-
* @param {number} vertex_p pointer to {@link Box2D.b2Vec2}
|
|
236
|
-
* @param {number} sizeMetres
|
|
237
|
-
* @param {number} pointer to {@link Box2D.b2Color}
|
|
238
|
-
* @returns {void}
|
|
239
|
-
*/
|
|
240
|
-
DrawPoint(vertex_p, sizeMetres, color_p) {
|
|
241
|
-
const color = wrapPointer(color_p, b2Color)
|
|
242
|
-
setCtxColor(getRgbStr(color))
|
|
243
|
-
const vertex = wrapPointer(vertex_p, b2Vec2)
|
|
244
|
-
drawPoint(vertex, sizeMetres)
|
|
245
|
-
},
|
|
246
|
-
})
|
|
247
|
-
debugDraw.SetFlags(e_shapeBit)
|
|
248
|
-
return debugDraw
|
|
249
|
-
}
|
package/src/box2d-wasm/index.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { GameWorld, Vec2 } from '..'
|
|
2
|
-
import { PhysicsSystem } from './PhysicsSystem'
|
|
3
|
-
|
|
4
|
-
export * from './PhysicsComponent'
|
|
5
|
-
export * from './PhysicsSprite'
|
|
6
|
-
export * from './PhysicsSystem'
|
|
7
|
-
|
|
8
|
-
export function setupPhysics(world = GameWorld.Instance, isDebugDraw?: boolean, gravity?: Vec2) {
|
|
9
|
-
console.log('app world', world.app)
|
|
10
|
-
world.systems.add(PhysicsSystem)
|
|
11
|
-
world.systems.configureOnce(PhysicsSystem)
|
|
12
|
-
world.listUpdate.push(PhysicsSystem)
|
|
13
|
-
if (isDebugDraw) {
|
|
14
|
-
world.systems.get(PhysicsSystem).addDebug()
|
|
15
|
-
}
|
|
16
|
-
if (gravity) {
|
|
17
|
-
world.systems.get(PhysicsSystem).gravity = gravity
|
|
18
|
-
}
|
|
19
|
-
}
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
import { Graphics, Point, Rectangle, Size } from 'pixi.js'
|
|
2
|
-
|
|
3
|
-
import { GameWorld } from '..'
|
|
4
|
-
import { NoRenderComponentX } from '../components/BaseComponent'
|
|
5
|
-
import { NodeComp } from '../components/NodeComp'
|
|
6
|
-
import { v2 } from '../helper/utils'
|
|
7
|
-
import { circleCircle, polygonCircle, polygonPolygon } from './helper/Intersection'
|
|
8
|
-
import { getMax, getMin } from './helper/utils'
|
|
9
|
-
|
|
10
|
-
function getNodeToWorldTransformAR(node: NodeComp) {
|
|
11
|
-
const t = node.instance.worldTransform
|
|
12
|
-
const x = node.instance.pivot.x * node.instance.width
|
|
13
|
-
const y = node.instance.pivot.y * node.instance.height
|
|
14
|
-
const transform = t.translate(x, y)
|
|
15
|
-
return transform
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function cloneRect(origin: Rectangle) {
|
|
19
|
-
return new Rectangle(origin.x, origin.y, origin.width, origin.height)
|
|
20
|
-
}
|
|
21
|
-
interface ColliderProps {
|
|
22
|
-
offset?: Point
|
|
23
|
-
tag?: number
|
|
24
|
-
enabled?: boolean
|
|
25
|
-
onCollisionEnter?: (other: Collider) => void
|
|
26
|
-
onCollisionExit?: (other: Collider) => void
|
|
27
|
-
onCollisionStay?: (other: Collider) => void
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class Collider<T = ColliderProps> extends NoRenderComponentX<T> {
|
|
31
|
-
_worldPoints: Point[] = []
|
|
32
|
-
_worldPosition: Point
|
|
33
|
-
_worldRadius
|
|
34
|
-
_AABB: Rectangle = new Rectangle(0, 0, 0, 0)
|
|
35
|
-
_preAabb: Rectangle = new Rectangle(0, 0, 0, 0)
|
|
36
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
37
|
-
update(dt: number, draw?: Graphics) { }
|
|
38
|
-
getAABB() {
|
|
39
|
-
return this._AABB
|
|
40
|
-
}
|
|
41
|
-
get world() {
|
|
42
|
-
return {
|
|
43
|
-
points: this._worldPoints,
|
|
44
|
-
preAabb: this._preAabb,
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
interface BoxColliderProps extends ColliderProps {
|
|
50
|
-
width: number
|
|
51
|
-
height: number
|
|
52
|
-
}
|
|
53
|
-
export class BoxCollider extends Collider<BoxColliderProps> {
|
|
54
|
-
|
|
55
|
-
get size(): Size {
|
|
56
|
-
return this.props
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
set size(s: Size) {
|
|
60
|
-
this.props.width = s.width
|
|
61
|
-
this.props.height = s.height
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
update(dt, draw: Graphics) {
|
|
65
|
-
if (!this.node) {
|
|
66
|
-
return
|
|
67
|
-
}
|
|
68
|
-
const { x, y } = this.props.offset || v2()
|
|
69
|
-
// const hw = this.width * 0.5
|
|
70
|
-
// const hh = this.height * 0.5
|
|
71
|
-
const transform = getNodeToWorldTransformAR(this.node)
|
|
72
|
-
// const dx = x - hw
|
|
73
|
-
// const dy = y - hh
|
|
74
|
-
const collider = this.getComponent(Collider)
|
|
75
|
-
collider._worldPoints = [
|
|
76
|
-
v2(x, y),
|
|
77
|
-
v2(x, y + this.props.height),
|
|
78
|
-
v2(x + this.props.width, y + this.props.height),
|
|
79
|
-
v2(x + this.props.width, y)
|
|
80
|
-
].map(p => transform.apply(p))
|
|
81
|
-
// console.log("_worldPoints", collider._worldPoints, rectTrs)
|
|
82
|
-
// collider._worldPoints = collider._worldPoints.map(p => transform.apply(p))
|
|
83
|
-
const listX = collider._worldPoints.map(({ x }) => x)
|
|
84
|
-
const listY = collider._worldPoints.map(({ y }) => y)
|
|
85
|
-
collider._preAabb = cloneRect(collider._AABB)
|
|
86
|
-
collider._AABB.x = getMin(listX)
|
|
87
|
-
collider._AABB.y = getMin(listY)
|
|
88
|
-
collider._AABB.width = getMax(listX) - collider._AABB.x
|
|
89
|
-
collider._AABB.height = getMax(listY) - collider._AABB.y
|
|
90
|
-
if (draw) {
|
|
91
|
-
// console.log("drawing", JSON.stringify(collider._worldPoints))
|
|
92
|
-
const drawList = collider._worldPoints
|
|
93
|
-
// draw.clear()
|
|
94
|
-
draw.poly(drawList)
|
|
95
|
-
// draw.fill({ color: '#fff', alpha: 0.3 })
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
interface CircleColliderProps extends ColliderProps {
|
|
101
|
-
radius: number
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export class CircleCollider extends Collider<CircleColliderProps> {
|
|
105
|
-
|
|
106
|
-
update(dt, draw: Graphics) {
|
|
107
|
-
if (!this.node) {
|
|
108
|
-
return
|
|
109
|
-
}
|
|
110
|
-
const transform = getNodeToWorldTransformAR(this.node)
|
|
111
|
-
const collider = this.getComponent(Collider)
|
|
112
|
-
collider._worldRadius = this.props.radius * this.node.scaleX
|
|
113
|
-
collider._worldPosition = transform.apply(this.props.offset)
|
|
114
|
-
if (draw) {
|
|
115
|
-
const { x } = collider._worldPosition
|
|
116
|
-
const y = GameWorld.Instance.app.screen.height - collider._worldPosition.y
|
|
117
|
-
draw.rect(x, y, 2, 2)
|
|
118
|
-
draw.circle(x, y, collider._worldRadius)
|
|
119
|
-
}
|
|
120
|
-
collider._preAabb = cloneRect(collider._AABB)
|
|
121
|
-
collider._AABB.x = collider._worldPosition.x - collider._worldRadius
|
|
122
|
-
collider._AABB.y = collider._worldPosition.y - collider._worldRadius
|
|
123
|
-
collider._AABB.width = collider._worldRadius * 2
|
|
124
|
-
collider._AABB.height = collider._AABB.width
|
|
125
|
-
// draw.drawRect(p(this._AABB.x, this._AABB.y),
|
|
126
|
-
// p(this._worldPosition.x + this._worldRadius, this._worldPosition.y + this._worldRadius),
|
|
127
|
-
// Color.WHITE, 3, Color.DEBUG_BORDER_COLOR);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
interface PolygonColliderProps extends ColliderProps {
|
|
133
|
-
points: Array<Point>
|
|
134
|
-
}
|
|
135
|
-
export class PolygonCollider extends Collider<PolygonColliderProps> {
|
|
136
|
-
|
|
137
|
-
get points(): Point[] {
|
|
138
|
-
const { x, y } = this.props.offset
|
|
139
|
-
const pointsList = this.props.points.map((p) => v2(p.x + x, p.y + y))
|
|
140
|
-
return pointsList
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
set points(points: Point[]) {
|
|
144
|
-
this.props.points = points
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
update(dt, draw: Graphics) {
|
|
148
|
-
if (!this.node) {
|
|
149
|
-
return
|
|
150
|
-
}
|
|
151
|
-
const transform = getNodeToWorldTransformAR(this.node)
|
|
152
|
-
const collider = this.getComponent(Collider)
|
|
153
|
-
collider._worldPoints = this.points.map((p) => transform.apply(p))
|
|
154
|
-
// log(polyPoints);
|
|
155
|
-
if (draw) {
|
|
156
|
-
const drawList = collider._worldPoints.map(({ x, y }) => v2(x, GameWorld.Instance.app.screen.height - y))
|
|
157
|
-
draw.poly(drawList)
|
|
158
|
-
}
|
|
159
|
-
const listX = collider._worldPoints.map(({ x }) => x)
|
|
160
|
-
const listY = collider._worldPoints.map(({ y }) => y)
|
|
161
|
-
collider._preAabb = cloneRect(collider._AABB)
|
|
162
|
-
collider._AABB.x = getMin(listX)
|
|
163
|
-
collider._AABB.y = getMin(listY)
|
|
164
|
-
collider._AABB.width = getMax(listX) - collider._AABB.x
|
|
165
|
-
collider._AABB.height = getMax(listY) - collider._AABB.y
|
|
166
|
-
// draw.drawRect(p(this._AABB.x, this._AABB.y), p(max(listX), max(listY)),
|
|
167
|
-
// Color.WHITE, 3, Color.DEBUG_BORDER_COLOR);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
export enum CollisionType {
|
|
172
|
-
NONE,
|
|
173
|
-
ENTER,
|
|
174
|
-
STAY,
|
|
175
|
-
EXIT,
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
function isPolygonCollider(col: Collider) {
|
|
179
|
-
return col.getComponent(PolygonCollider) || col.getComponent(BoxCollider)
|
|
180
|
-
}
|
|
181
|
-
function isCircleCollider(col: Collider) {
|
|
182
|
-
return col.getComponent(CircleCollider)
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export class Contract {
|
|
186
|
-
_collider1: Collider
|
|
187
|
-
_collider2: Collider
|
|
188
|
-
_touching: boolean
|
|
189
|
-
_isPolygonPolygon: boolean
|
|
190
|
-
_isCircleCircle: boolean
|
|
191
|
-
_isPolygonCircle: boolean
|
|
192
|
-
|
|
193
|
-
constructor(collider1: Collider, collider2: Collider) {
|
|
194
|
-
this._collider1 = collider1
|
|
195
|
-
this._collider2 = collider2
|
|
196
|
-
const isCollider1Polygon = isPolygonCollider(collider1)
|
|
197
|
-
const isCollider2Polygon = isPolygonCollider(collider2)
|
|
198
|
-
const isCollider1Circle = isCircleCollider(collider1)
|
|
199
|
-
const isCollider2Circle = isCircleCollider(collider2)
|
|
200
|
-
|
|
201
|
-
if (isCollider1Polygon && isCollider2Polygon) {
|
|
202
|
-
this._isPolygonPolygon = true
|
|
203
|
-
} else if (isCollider1Circle && isCollider2Circle) {
|
|
204
|
-
this._isCircleCircle = true
|
|
205
|
-
} else if (isCollider1Polygon && isCollider2Circle) {
|
|
206
|
-
this._isPolygonCircle = true
|
|
207
|
-
} else if (isCollider1Circle && isCollider2Polygon) {
|
|
208
|
-
this._isPolygonCircle = true
|
|
209
|
-
this._collider1 = collider2
|
|
210
|
-
this._collider2 = collider1
|
|
211
|
-
}
|
|
212
|
-
// log(this._isPolygonPolygon);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
updateState() {
|
|
216
|
-
const result = this.test()
|
|
217
|
-
|
|
218
|
-
let type = CollisionType.NONE
|
|
219
|
-
if (result && !this._touching) {
|
|
220
|
-
this._touching = true
|
|
221
|
-
type = CollisionType.ENTER
|
|
222
|
-
} else if (result && this._touching) {
|
|
223
|
-
type = CollisionType.STAY
|
|
224
|
-
} else if (!result && this._touching) {
|
|
225
|
-
this._touching = false
|
|
226
|
-
type = CollisionType.EXIT
|
|
227
|
-
}
|
|
228
|
-
// console.log('updateState', result, this._touching, type)
|
|
229
|
-
return type
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
test() {
|
|
233
|
-
// if (!shouldCollider(this._collider1, this._collider2)) {
|
|
234
|
-
// return false
|
|
235
|
-
// }
|
|
236
|
-
// log(this._collider1.getAABB(), this._collider2.getAABB());
|
|
237
|
-
if (!this._collider1.getAABB().intersects(this._collider2.getAABB())) {
|
|
238
|
-
return false
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
if (this._isPolygonPolygon) {
|
|
242
|
-
return polygonPolygon(this._collider1._worldPoints, this._collider2._worldPoints)
|
|
243
|
-
}
|
|
244
|
-
if (this._isCircleCircle) {
|
|
245
|
-
const p1 = this._collider1
|
|
246
|
-
const p2 = this._collider2
|
|
247
|
-
return circleCircle(p1._worldPosition, p1._worldRadius, p2._worldPosition, p2._worldRadius)
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (this._isPolygonCircle) {
|
|
251
|
-
const p2 = this._collider2
|
|
252
|
-
return polygonCircle(this._collider1._worldPoints, p2._worldPosition, p2._worldRadius)
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return false
|
|
256
|
-
}
|
|
257
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { EntityManager, EventManager, EventTypes, System } from 'entityx-ts'
|
|
2
|
-
import { Color, Graphics } from 'pixi.js'
|
|
3
|
-
|
|
4
|
-
import { GameWorld } from '../base'
|
|
5
|
-
import { NodeComp } from '../components/NodeComp'
|
|
6
|
-
import { BoxCollider, CircleCollider, Collider, CollisionType, Contract, PolygonCollider } from './CollideComponent'
|
|
7
|
-
|
|
8
|
-
export function enabledDebugDraw(enable = true) {
|
|
9
|
-
const collideSystem = GameWorld.Instance.systems.get(CollideSystem)
|
|
10
|
-
collideSystem.enabledDebugDraw = enable
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export class CollideSystem implements System {
|
|
14
|
-
listColliders: Collider[] = []
|
|
15
|
-
_contracts: Contract[] = []
|
|
16
|
-
removeColliders: Collider[] = []
|
|
17
|
-
debugGraphics: Graphics
|
|
18
|
-
enabledDebugDraw = true
|
|
19
|
-
enabled = true
|
|
20
|
-
colliderMatrix = [[true]]
|
|
21
|
-
|
|
22
|
-
configure(event_manager: EventManager) {
|
|
23
|
-
event_manager.subscribe(EventTypes.ComponentAdded, BoxCollider, this.onAddCollider.bind(this))
|
|
24
|
-
event_manager.subscribe(EventTypes.ComponentAdded, CircleCollider, this.onAddCollider.bind(this))
|
|
25
|
-
event_manager.subscribe(EventTypes.ComponentAdded, PolygonCollider, this.onAddCollider.bind(this))
|
|
26
|
-
event_manager.subscribe(EventTypes.ComponentRemoved, BoxCollider, this.onRemoveCollider.bind(this))
|
|
27
|
-
event_manager.subscribe(EventTypes.ComponentRemoved, CircleCollider, this.onRemoveCollider.bind(this))
|
|
28
|
-
event_manager.subscribe(EventTypes.ComponentRemoved, PolygonCollider, this.onRemoveCollider.bind(this))
|
|
29
|
-
if (this.enabledDebugDraw) {
|
|
30
|
-
this.debugGraphics = new Graphics()
|
|
31
|
-
this.debugGraphics.setFillStyle({ color: new Color('white') })
|
|
32
|
-
this.debugGraphics.width = 4
|
|
33
|
-
this.debugGraphics.zIndex = 40
|
|
34
|
-
}
|
|
35
|
-
GameWorld.Instance.app.stage.addChild(this.debugGraphics)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
update(entities: EntityManager, events: EventManager, dt: number) {
|
|
39
|
-
if (!this.enabled) {
|
|
40
|
-
return
|
|
41
|
-
}
|
|
42
|
-
this.listColliders.forEach((collider) => {
|
|
43
|
-
if (!collider.node.active) {
|
|
44
|
-
this.removeColliders.push(collider)
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
// this.removeColliders.forEach((comp) => {
|
|
48
|
-
// this.listColliders = this.listColliders.filter((col) => !col.isEqual(comp) && col.node.active)
|
|
49
|
-
// this._contracts = this._contracts.filter((contract) => {
|
|
50
|
-
// const col1 = contract._collider1
|
|
51
|
-
// const col2 = contract._collider2
|
|
52
|
-
// if (col1.isEqual(comp) || !col1.node.active) {
|
|
53
|
-
// if (contract._touching) {
|
|
54
|
-
// // contract._touching = false
|
|
55
|
-
// if (col2.onCollisionExit) {
|
|
56
|
-
// col2.onCollisionExit(col1)
|
|
57
|
-
// }
|
|
58
|
-
// }
|
|
59
|
-
// return false
|
|
60
|
-
// }
|
|
61
|
-
// if (col2.isEqual(comp) || !col2.node.active) {
|
|
62
|
-
// if (contract._touching) {
|
|
63
|
-
// // contract._touching = false
|
|
64
|
-
// if (col1.onCollisionExit) col1.onCollisionExit(col2)
|
|
65
|
-
// }
|
|
66
|
-
// return false
|
|
67
|
-
// }
|
|
68
|
-
// return true
|
|
69
|
-
// })
|
|
70
|
-
// })
|
|
71
|
-
this.removeColliders = []
|
|
72
|
-
const draw = this.enabledDebugDraw ? this.debugGraphics : undefined
|
|
73
|
-
if (this.enabledDebugDraw) {
|
|
74
|
-
draw.clear()
|
|
75
|
-
}
|
|
76
|
-
for (const entt of entities.entities_with_components(BoxCollider)) {
|
|
77
|
-
const comp = entt.getComponent(BoxCollider)
|
|
78
|
-
comp.update(dt, draw)
|
|
79
|
-
}
|
|
80
|
-
for (const entt of entities.entities_with_components(CircleCollider)) {
|
|
81
|
-
const comp = entt.getComponent(CircleCollider)
|
|
82
|
-
comp.update(dt, draw)
|
|
83
|
-
}
|
|
84
|
-
for (const entt of entities.entities_with_components(PolygonCollider)) {
|
|
85
|
-
const comp = entt.getComponent(PolygonCollider)
|
|
86
|
-
comp.update(dt, draw)
|
|
87
|
-
}
|
|
88
|
-
if (this.enabledDebugDraw) {
|
|
89
|
-
// draw.clear()
|
|
90
|
-
// draw.removeFromParent()
|
|
91
|
-
// app.stage.addChild(draw)
|
|
92
|
-
// console.log('enabledDebugDraw', this.debugGraphics)
|
|
93
|
-
// this.debugGraphics.width = 4
|
|
94
|
-
// this.debugGraphics.circle(500, 600, 450)
|
|
95
|
-
this.debugGraphics.fill({ color: new Color('white'), alpha: 0.3 })
|
|
96
|
-
}
|
|
97
|
-
// console.log(this._contracts.length)
|
|
98
|
-
this._contracts.forEach((contract) => {
|
|
99
|
-
const col1 = contract._collider1
|
|
100
|
-
const col2 = contract._collider2
|
|
101
|
-
if (!col1.node || !col2.node || !col1.node.active || !col2.node.active) {
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
const type = contract.updateState()
|
|
105
|
-
if (!col1 || !col2) {
|
|
106
|
-
return
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
switch (type) {
|
|
110
|
-
case CollisionType.ENTER: {
|
|
111
|
-
if (col1.props.onCollisionEnter) {
|
|
112
|
-
col1.props.onCollisionEnter(col2)
|
|
113
|
-
}
|
|
114
|
-
if (col2.props.onCollisionEnter) {
|
|
115
|
-
col2.props.onCollisionEnter(col1)
|
|
116
|
-
}
|
|
117
|
-
break
|
|
118
|
-
}
|
|
119
|
-
case CollisionType.STAY:
|
|
120
|
-
if (col1.props.onCollisionStay) {
|
|
121
|
-
col1.props.onCollisionStay(col2)
|
|
122
|
-
}
|
|
123
|
-
if (col2.props.onCollisionStay) {
|
|
124
|
-
col2.props.onCollisionStay(col1)
|
|
125
|
-
}
|
|
126
|
-
break
|
|
127
|
-
case CollisionType.EXIT:
|
|
128
|
-
if (col1.props.onCollisionExit) {
|
|
129
|
-
col1.props.onCollisionExit(col2)
|
|
130
|
-
}
|
|
131
|
-
if (col2.props.onCollisionExit) {
|
|
132
|
-
col2.props.onCollisionExit(col1)
|
|
133
|
-
}
|
|
134
|
-
break
|
|
135
|
-
|
|
136
|
-
default:
|
|
137
|
-
break
|
|
138
|
-
}
|
|
139
|
-
})
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
addCollider(colliderPhysics: Collider) {
|
|
143
|
-
this.listColliders.forEach((col) => {
|
|
144
|
-
// if (shouldCollider(col, colliderPhysics)) {
|
|
145
|
-
this._contracts.push(new Contract(col, colliderPhysics))
|
|
146
|
-
// }
|
|
147
|
-
})
|
|
148
|
-
this.listColliders.push(colliderPhysics)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
removeCollider(colliderPhysics: Collider) {
|
|
152
|
-
this.removeColliders.push(colliderPhysics)
|
|
153
|
-
}
|
|
154
|
-
onAddCollider({ entity, component }) {
|
|
155
|
-
console.log('ComponentAddedEvent', component)
|
|
156
|
-
const collider = entity.assign(new Collider(component))
|
|
157
|
-
collider.node = entity.getComponent(NodeComp)
|
|
158
|
-
component.node = entity.getComponent(NodeComp)
|
|
159
|
-
this.addCollider(collider)
|
|
160
|
-
}
|
|
161
|
-
onRemoveCollider({ entity, component }) {
|
|
162
|
-
console.log('ComponentRemovedEvent', component)
|
|
163
|
-
const collider = entity.getComponent(Collider)
|
|
164
|
-
this.removeCollider(collider)
|
|
165
|
-
}
|
|
166
|
-
}
|