@safe-engine/pixi 8.1.3 → 8.2.2

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 (162) hide show
  1. package/@types/index.d.ts +2 -0
  2. package/@types/safex.d.ts +168 -0
  3. package/README.md +9 -3
  4. package/dist/app.d.ts +1 -2
  5. package/dist/app.d.ts.map +1 -1
  6. package/dist/app.js +25 -24
  7. package/dist/base/EnhancedComponent.d.ts +25 -0
  8. package/dist/base/EnhancedComponent.d.ts.map +1 -0
  9. package/dist/base/EnhancedComponent.js +26 -0
  10. package/dist/base/gworld.d.ts +8 -0
  11. package/dist/base/gworld.d.ts.map +1 -0
  12. package/dist/base/gworld.js +16 -0
  13. package/dist/base/index.d.ts +4 -0
  14. package/dist/base/index.d.ts.map +1 -0
  15. package/dist/base/index.js +3 -0
  16. package/dist/base/utils.d.ts +6 -0
  17. package/dist/base/utils.d.ts.map +1 -0
  18. package/dist/base/utils.js +3 -0
  19. package/dist/collider/CollideComponent.d.ts +63 -0
  20. package/dist/collider/CollideComponent.d.ts.map +1 -0
  21. package/dist/collider/CollideComponent.js +238 -0
  22. package/dist/collider/CollideSystem.d.ts +26 -0
  23. package/dist/collider/CollideSystem.d.ts.map +1 -0
  24. package/dist/collider/CollideSystem.js +159 -0
  25. package/dist/collider/helper/Intersection.d.ts +7 -0
  26. package/dist/collider/helper/Intersection.d.ts.map +1 -0
  27. package/dist/collider/helper/Intersection.js +111 -0
  28. package/dist/collider/helper/utils.d.ts +3 -0
  29. package/dist/collider/helper/utils.d.ts.map +1 -0
  30. package/dist/collider/helper/utils.js +11 -0
  31. package/dist/collider/index.d.ts +3 -0
  32. package/dist/collider/index.d.ts.map +1 -0
  33. package/dist/collider/index.js +2 -0
  34. package/dist/components/BaseComponent.d.ts +6 -5
  35. package/dist/components/BaseComponent.d.ts.map +1 -1
  36. package/dist/components/BaseComponent.js +7 -9
  37. package/dist/components/NodeComp.d.ts +13 -13
  38. package/dist/components/NodeComp.d.ts.map +1 -1
  39. package/dist/components/NodeComp.js +34 -30
  40. package/dist/components/Scene.d.ts +2 -3
  41. package/dist/components/Scene.d.ts.map +1 -1
  42. package/dist/components/Scene.js +6 -10
  43. package/dist/core/Color.d.ts +1 -0
  44. package/dist/core/Color.d.ts.map +1 -1
  45. package/dist/core/Color.js +3 -6
  46. package/dist/core/LoadingBar.js +10 -15
  47. package/dist/core/NodePool.d.ts +9 -0
  48. package/dist/core/NodePool.d.ts.map +1 -0
  49. package/dist/core/NodePool.js +24 -0
  50. package/dist/core/Size.js +1 -4
  51. package/dist/core/director.d.ts +3 -0
  52. package/dist/core/director.d.ts.map +1 -0
  53. package/dist/core/director.js +7 -0
  54. package/dist/core/math.d.ts +4 -0
  55. package/dist/core/math.d.ts.map +1 -0
  56. package/dist/core/math.js +10 -0
  57. package/dist/dragonbones/DragonBonesComponent.d.ts +17 -0
  58. package/dist/dragonbones/DragonBonesComponent.d.ts.map +1 -0
  59. package/dist/dragonbones/DragonBonesComponent.js +18 -0
  60. package/dist/dragonbones/DragonBonesSystem.d.ts +6 -0
  61. package/dist/dragonbones/DragonBonesSystem.d.ts.map +1 -0
  62. package/dist/dragonbones/DragonBonesSystem.js +29 -0
  63. package/dist/dragonbones/index.d.ts +3 -0
  64. package/dist/dragonbones/index.d.ts.map +1 -0
  65. package/dist/dragonbones/index.js +2 -0
  66. package/dist/{components → gui}/GUIComponent.d.ts +29 -23
  67. package/dist/gui/GUIComponent.d.ts.map +1 -0
  68. package/dist/gui/GUIComponent.js +123 -0
  69. package/dist/{systems → gui}/GUISystem.d.ts +1 -1
  70. package/dist/gui/GUISystem.d.ts.map +1 -0
  71. package/dist/gui/GUISystem.js +100 -0
  72. package/dist/helper/html-text-parser.d.ts +19 -29
  73. package/dist/helper/html-text-parser.d.ts.map +1 -1
  74. package/dist/helper/html-text-parser.js +57 -346
  75. package/dist/helper/utils.d.ts +2 -3
  76. package/dist/helper/utils.d.ts.map +1 -1
  77. package/dist/helper/utils.js +18 -23
  78. package/dist/index.d.ts +16 -6
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +22 -28
  81. package/dist/norender/NoRenderComponent.d.ts +35 -0
  82. package/dist/norender/NoRenderComponent.d.ts.map +1 -0
  83. package/dist/norender/NoRenderComponent.js +53 -0
  84. package/dist/norender/NoRenderSystem.d.ts +5 -0
  85. package/dist/norender/NoRenderSystem.d.ts.map +1 -0
  86. package/dist/norender/NoRenderSystem.js +57 -0
  87. package/dist/planck/PhysicsComponent.d.ts +37 -0
  88. package/dist/planck/PhysicsComponent.d.ts.map +1 -0
  89. package/dist/planck/PhysicsComponent.js +52 -0
  90. package/dist/planck/PhysicsSprite.d.ts +16 -0
  91. package/dist/planck/PhysicsSprite.d.ts.map +1 -0
  92. package/dist/planck/PhysicsSprite.js +31 -0
  93. package/dist/planck/PhysicsSystem.d.ts +20 -0
  94. package/dist/planck/PhysicsSystem.d.ts.map +1 -0
  95. package/dist/planck/PhysicsSystem.js +187 -0
  96. package/dist/planck/index.d.ts +4 -0
  97. package/dist/planck/index.d.ts.map +1 -0
  98. package/dist/planck/index.js +3 -0
  99. package/dist/render/RenderComponent.d.ts +52 -0
  100. package/dist/render/RenderComponent.d.ts.map +1 -0
  101. package/dist/render/RenderComponent.js +104 -0
  102. package/dist/render/RenderSystem.d.ts.map +1 -0
  103. package/dist/render/RenderSystem.js +65 -0
  104. package/dist/spine/SpineComponent.d.ts +10 -0
  105. package/dist/spine/SpineComponent.d.ts.map +1 -0
  106. package/dist/spine/SpineComponent.js +3 -0
  107. package/dist/spine/SpineSystem.d.ts +5 -0
  108. package/dist/spine/SpineSystem.d.ts.map +1 -0
  109. package/dist/spine/SpineSystem.js +25 -0
  110. package/dist/spine/index.d.ts +3 -0
  111. package/dist/spine/index.d.ts.map +1 -0
  112. package/dist/spine/index.js +2 -0
  113. package/dist/spine/lib/BatchableSpineSlot.d.ts +59 -0
  114. package/dist/spine/lib/BatchableSpineSlot.d.ts.map +1 -0
  115. package/dist/spine/lib/BatchableSpineSlot.js +86 -0
  116. package/dist/spine/lib/Spine.d.ts +239 -0
  117. package/dist/spine/lib/Spine.d.ts.map +1 -0
  118. package/dist/spine/lib/Spine.js +628 -0
  119. package/dist/spine/lib/SpineDebugRenderer.d.ts +109 -0
  120. package/dist/spine/lib/SpineDebugRenderer.d.ts.map +1 -0
  121. package/dist/spine/lib/SpineDebugRenderer.js +474 -0
  122. package/dist/spine/lib/SpinePipe.d.ts +49 -0
  123. package/dist/spine/lib/SpinePipe.d.ts.map +1 -0
  124. package/dist/spine/lib/SpinePipe.js +148 -0
  125. package/dist/spine/lib/SpineTexture.d.ts +45 -0
  126. package/dist/spine/lib/SpineTexture.d.ts.map +1 -0
  127. package/dist/spine/lib/SpineTexture.js +114 -0
  128. package/dist/spine/lib/assets/atlasLoader.d.ts +34 -0
  129. package/dist/spine/lib/assets/atlasLoader.d.ts.map +1 -0
  130. package/dist/spine/lib/assets/atlasLoader.js +122 -0
  131. package/dist/spine/lib/assets/skeletonLoader.d.ts +30 -0
  132. package/dist/spine/lib/assets/skeletonLoader.d.ts.map +1 -0
  133. package/dist/spine/lib/assets/skeletonLoader.js +70 -0
  134. package/dist/spine/lib/darktint/DarkTintBatchGeometry.d.ts +33 -0
  135. package/dist/spine/lib/darktint/DarkTintBatchGeometry.d.ts.map +1 -0
  136. package/dist/spine/lib/darktint/DarkTintBatchGeometry.js +84 -0
  137. package/dist/spine/lib/darktint/DarkTintBatcher.d.ts +50 -0
  138. package/dist/spine/lib/darktint/DarkTintBatcher.d.ts.map +1 -0
  139. package/dist/spine/lib/darktint/DarkTintBatcher.js +131 -0
  140. package/dist/spine/lib/darktint/DarkTintShader.d.ts +33 -0
  141. package/dist/spine/lib/darktint/DarkTintShader.d.ts.map +1 -0
  142. package/dist/spine/lib/darktint/DarkTintShader.js +59 -0
  143. package/dist/spine/lib/darktint/darkTintBit.d.ts +51 -0
  144. package/dist/spine/lib/darktint/darkTintBit.d.ts.map +1 -0
  145. package/dist/spine/lib/darktint/darkTintBit.js +75 -0
  146. package/dist/spine/lib/index.d.ts +42 -0
  147. package/dist/spine/lib/index.d.ts.map +1 -0
  148. package/dist/spine/lib/index.js +41 -0
  149. package/dist/spine/lib/require-shim.d.ts +34 -0
  150. package/dist/spine/lib/require-shim.d.ts.map +1 -0
  151. package/dist/spine/lib/require-shim.js +38 -0
  152. package/package.json +12 -9
  153. package/dist/components/GUIComponent.d.ts.map +0 -1
  154. package/dist/components/GUIComponent.js +0 -126
  155. package/dist/components/RenderComponent.d.ts +0 -29
  156. package/dist/components/RenderComponent.d.ts.map +0 -1
  157. package/dist/components/RenderComponent.js +0 -58
  158. package/dist/systems/GUISystem.d.ts.map +0 -1
  159. package/dist/systems/GUISystem.js +0 -90
  160. package/dist/systems/RenderSystem.d.ts.map +0 -1
  161. package/dist/systems/RenderSystem.js +0 -67
  162. /package/dist/{systems → render}/RenderSystem.d.ts +0 -0
@@ -0,0 +1,238 @@
1
+ import chunk from 'lodash/chunk';
2
+ import flatten from 'lodash/flatten';
3
+ import max from 'lodash/max';
4
+ import min from 'lodash/min';
5
+ import { Rectangle } from 'pixi.js';
6
+ import { app } from '../app';
7
+ import { NoRenderComponentX } from '../components/BaseComponent';
8
+ import { v2 } from '../helper/utils';
9
+ import { circleCircle, polygonCircle, polygonPolygon } from './helper/Intersection';
10
+ function getNodeToWorldTransformAR(node) {
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
+ function cloneRect(origin) {
18
+ return new Rectangle(origin.x, origin.y, origin.width, origin.height);
19
+ }
20
+ export class Collider extends NoRenderComponentX {
21
+ constructor() {
22
+ super(...arguments);
23
+ this.enabled = true;
24
+ this._worldPoints = [];
25
+ this._AABB = new Rectangle(0, 0, 0, 0);
26
+ this._preAabb = new Rectangle(0, 0, 0, 0);
27
+ }
28
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
29
+ update(dt, draw) { }
30
+ getAABB() {
31
+ return this._AABB;
32
+ }
33
+ get world() {
34
+ return {
35
+ points: this._worldPoints,
36
+ preAabb: this._preAabb,
37
+ };
38
+ }
39
+ setOnCollisionEnter(cb) {
40
+ const collider = this.getComponent(Collider);
41
+ collider.onCollisionEnter = cb;
42
+ }
43
+ setOnCollisionExit(cb) {
44
+ const collider = this.getComponent(Collider);
45
+ collider.onCollisionExit = cb;
46
+ }
47
+ setOnCollisionStay(cb) {
48
+ const collider = this.getComponent(Collider);
49
+ collider.onCollisionStay = cb;
50
+ }
51
+ }
52
+ export class BoxCollider extends Collider {
53
+ constructor(props) {
54
+ super(props);
55
+ }
56
+ get size() {
57
+ return this;
58
+ }
59
+ set size(s) {
60
+ this.width = s.width;
61
+ this.height = s.height;
62
+ }
63
+ update(dt, draw) {
64
+ if (!this.node) {
65
+ return;
66
+ }
67
+ const { x, y } = this.offset || v2();
68
+ // const hw = this.width * 0.5
69
+ // const hh = this.height * 0.5
70
+ const transform = getNodeToWorldTransformAR(this.node);
71
+ // const dx = x - hw
72
+ // const dy = y - hh
73
+ const collider = this.getComponent(Collider);
74
+ collider._worldPoints = [
75
+ v2(x, y),
76
+ v2(x, y + this.height),
77
+ v2(x + this.width, y + this.height),
78
+ v2(x + this.width, y)
79
+ ].map(p => transform.apply(p));
80
+ // console.log("_worldPoints", collider._worldPoints, rectTrs)
81
+ // collider._worldPoints = collider._worldPoints.map(p => transform.apply(p))
82
+ const listX = collider._worldPoints.map(({ x }) => x);
83
+ const listY = collider._worldPoints.map(({ y }) => y);
84
+ collider._preAabb = cloneRect(collider._AABB);
85
+ collider._AABB.x = min(listX);
86
+ collider._AABB.y = min(listY);
87
+ collider._AABB.width = max(listX) - collider._AABB.x;
88
+ collider._AABB.height = max(listY) - collider._AABB.y;
89
+ if (draw) {
90
+ // console.log("drawing", JSON.stringify(collider._worldPoints))
91
+ const drawList = collider._worldPoints;
92
+ // draw.clear()
93
+ draw.poly(drawList);
94
+ // draw.fill({ color: '#fff', alpha: 0.3 })
95
+ }
96
+ }
97
+ }
98
+ export class CircleCollider extends Collider {
99
+ constructor(props) {
100
+ super(props);
101
+ }
102
+ update(dt, draw) {
103
+ if (!this.node) {
104
+ return;
105
+ }
106
+ const transform = getNodeToWorldTransformAR(this.node);
107
+ const collider = this.getComponent(Collider);
108
+ collider._worldRadius = this.radius * this.node.scaleX;
109
+ collider._worldPosition = transform.apply(this.offset);
110
+ if (draw) {
111
+ const { x } = collider._worldPosition;
112
+ const y = app.screen.height - collider._worldPosition.y;
113
+ draw.rect(x, y, 2, 2);
114
+ draw.circle(x, y, collider._worldRadius);
115
+ }
116
+ collider._preAabb = cloneRect(collider._AABB);
117
+ collider._AABB.x = collider._worldPosition.x - collider._worldRadius;
118
+ collider._AABB.y = collider._worldPosition.y - collider._worldRadius;
119
+ collider._AABB.width = collider._worldRadius * 2;
120
+ collider._AABB.height = collider._AABB.width;
121
+ // draw.drawRect(p(this._AABB.x, this._AABB.y),
122
+ // p(this._worldPosition.x + this._worldRadius, this._worldPosition.y + this._worldRadius),
123
+ // Color.WHITE, 3, Color.DEBUG_BORDER_COLOR);
124
+ }
125
+ }
126
+ export class PolygonCollider extends Collider {
127
+ constructor(props) {
128
+ super(props);
129
+ this._points = props.points || [];
130
+ }
131
+ get points() {
132
+ const { x, y } = this.offset;
133
+ const pointsList = chunk(this._points, 2).map(([px, py]) => v2(px + x, py + y));
134
+ return pointsList;
135
+ }
136
+ set points(points) {
137
+ this._points = flatten(points.map(({ x, y }) => [x, y]));
138
+ }
139
+ update(dt, draw) {
140
+ if (!this.node) {
141
+ return;
142
+ }
143
+ const transform = getNodeToWorldTransformAR(this.node);
144
+ const collider = this.getComponent(Collider);
145
+ collider._worldPoints = this.points.map((p) => transform.apply(p));
146
+ // log(polyPoints);
147
+ if (draw) {
148
+ const drawList = collider._worldPoints.map(({ x, y }) => v2(x, app.screen.height - y));
149
+ draw.poly(drawList);
150
+ }
151
+ const listX = collider._worldPoints.map(({ x }) => x);
152
+ const listY = collider._worldPoints.map(({ y }) => y);
153
+ collider._preAabb = cloneRect(collider._AABB);
154
+ collider._AABB.x = min(listX);
155
+ collider._AABB.y = min(listY);
156
+ collider._AABB.width = max(listX) - collider._AABB.x;
157
+ collider._AABB.height = max(listY) - collider._AABB.y;
158
+ // draw.drawRect(p(this._AABB.x, this._AABB.y), p(max(listX), max(listY)),
159
+ // Color.WHITE, 3, Color.DEBUG_BORDER_COLOR);
160
+ }
161
+ }
162
+ export var CollisionType;
163
+ (function (CollisionType) {
164
+ CollisionType[CollisionType["NONE"] = 0] = "NONE";
165
+ CollisionType[CollisionType["ENTER"] = 1] = "ENTER";
166
+ CollisionType[CollisionType["STAY"] = 2] = "STAY";
167
+ CollisionType[CollisionType["EXIT"] = 3] = "EXIT";
168
+ })(CollisionType || (CollisionType = {}));
169
+ function isPolygonCollider(col) {
170
+ return col.getComponent(PolygonCollider) || col.getComponent(BoxCollider);
171
+ }
172
+ function isCircleCollider(col) {
173
+ return col.getComponent(CircleCollider);
174
+ }
175
+ export class Contract {
176
+ constructor(collider1, collider2) {
177
+ this._collider1 = collider1;
178
+ this._collider2 = collider2;
179
+ const isCollider1Polygon = isPolygonCollider(collider1);
180
+ const isCollider2Polygon = isPolygonCollider(collider2);
181
+ const isCollider1Circle = isCircleCollider(collider1);
182
+ const isCollider2Circle = isCircleCollider(collider2);
183
+ if (isCollider1Polygon && isCollider2Polygon) {
184
+ this._isPolygonPolygon = true;
185
+ }
186
+ else if (isCollider1Circle && isCollider2Circle) {
187
+ this._isCircleCircle = true;
188
+ }
189
+ else if (isCollider1Polygon && isCollider2Circle) {
190
+ this._isPolygonCircle = true;
191
+ }
192
+ else if (isCollider1Circle && isCollider2Polygon) {
193
+ this._isPolygonCircle = true;
194
+ this._collider1 = collider2;
195
+ this._collider2 = collider1;
196
+ }
197
+ // log(this._isPolygonPolygon);
198
+ }
199
+ updateState() {
200
+ const result = this.test();
201
+ let type = CollisionType.NONE;
202
+ if (result && !this._touching) {
203
+ this._touching = true;
204
+ type = CollisionType.ENTER;
205
+ }
206
+ else if (result && this._touching) {
207
+ type = CollisionType.STAY;
208
+ }
209
+ else if (!result && this._touching) {
210
+ this._touching = false;
211
+ type = CollisionType.EXIT;
212
+ }
213
+ // console.log('updateState', result, this._touching, type)
214
+ return type;
215
+ }
216
+ test() {
217
+ // if (!shouldCollider(this._collider1, this._collider2)) {
218
+ // return false
219
+ // }
220
+ // log(this._collider1.getAABB(), this._collider2.getAABB());
221
+ if (!this._collider1.getAABB().intersects(this._collider2.getAABB())) {
222
+ return false;
223
+ }
224
+ if (this._isPolygonPolygon) {
225
+ return polygonPolygon(this._collider1._worldPoints, this._collider2._worldPoints);
226
+ }
227
+ if (this._isCircleCircle) {
228
+ const p1 = this._collider1;
229
+ const p2 = this._collider2;
230
+ return circleCircle(p1._worldPosition, p1._worldRadius, p2._worldPosition, p2._worldRadius);
231
+ }
232
+ if (this._isPolygonCircle) {
233
+ const p2 = this._collider2;
234
+ return polygonCircle(this._collider1._worldPoints, p2._worldPosition, p2._worldRadius);
235
+ }
236
+ return false;
237
+ }
238
+ }
@@ -0,0 +1,26 @@
1
+ import { EntityManager, EventManager, System } from 'entityx-ts';
2
+ import { Graphics } from 'pixi.js';
3
+ import { Collider, Contract } from './CollideComponent';
4
+ export declare function enabledDebugDraw(enable?: boolean): void;
5
+ export declare class CollideSystem implements System {
6
+ listColliders: Collider[];
7
+ _contracts: Contract[];
8
+ removeColliders: Collider[];
9
+ debugGraphics: Graphics;
10
+ enabledDebugDraw: boolean;
11
+ enabled: boolean;
12
+ colliderMatrix: boolean[][];
13
+ configure(event_manager: EventManager): void;
14
+ update(entities: EntityManager, events: EventManager, dt: number): void;
15
+ addCollider(colliderPhysics: Collider): void;
16
+ removeCollider(colliderPhysics: Collider): void;
17
+ onAddCollider({ entity, component }: {
18
+ entity: any;
19
+ component: any;
20
+ }): void;
21
+ onRemoveCollider({ entity, component }: {
22
+ entity: any;
23
+ component: any;
24
+ }): void;
25
+ }
26
+ //# sourceMappingURL=CollideSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollideSystem.d.ts","sourceRoot":"","sources":["../../src/collider/CollideSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAc,MAAM,EAAE,MAAM,YAAY,CAAA;AAC5E,OAAO,EAAS,QAAQ,EAAE,MAAM,SAAS,CAAA;AAKzC,OAAO,EAA+B,QAAQ,EAAiB,QAAQ,EAAmB,MAAM,oBAAoB,CAAA;AAEpH,wBAAgB,gBAAgB,CAAC,MAAM,UAAO,QAG7C;AAED,qBAAa,aAAc,YAAW,MAAM;IAC1C,aAAa,EAAE,QAAQ,EAAE,CAAK;IAC9B,UAAU,EAAE,QAAQ,EAAE,CAAK;IAC3B,eAAe,EAAE,QAAQ,EAAE,CAAK;IAChC,aAAa,EAAE,QAAQ,CAAA;IACvB,gBAAgB,UAAO;IACvB,OAAO,UAAO;IACd,cAAc,cAAW;IAEzB,SAAS,CAAC,aAAa,EAAE,YAAY;IAgBrC,MAAM,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM;IAwGhE,WAAW,CAAC,eAAe,EAAE,QAAQ;IASrC,cAAc,CAAC,eAAe,EAAE,QAAQ;IAGxC,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;;;KAAA;IAOnC,gBAAgB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;;;KAAA;CAKvC"}
@@ -0,0 +1,159 @@
1
+ import { EventTypes } from 'entityx-ts';
2
+ import { Color, Graphics } from 'pixi.js';
3
+ import { app } from '../app';
4
+ import { GameWorld } from '../base';
5
+ import { NodeComp } from '../components/NodeComp';
6
+ import { BoxCollider, CircleCollider, Collider, CollisionType, Contract, PolygonCollider } from './CollideComponent';
7
+ export function enabledDebugDraw(enable = true) {
8
+ const collideSystem = GameWorld.Instance.systems.get(CollideSystem);
9
+ collideSystem.enabledDebugDraw = enable;
10
+ }
11
+ export class CollideSystem {
12
+ constructor() {
13
+ this.listColliders = [];
14
+ this._contracts = [];
15
+ this.removeColliders = [];
16
+ this.enabledDebugDraw = true;
17
+ this.enabled = true;
18
+ this.colliderMatrix = [[true]];
19
+ }
20
+ configure(event_manager) {
21
+ event_manager.subscribe(EventTypes.ComponentAdded, BoxCollider, this.onAddCollider.bind(this));
22
+ event_manager.subscribe(EventTypes.ComponentAdded, CircleCollider, this.onAddCollider.bind(this));
23
+ event_manager.subscribe(EventTypes.ComponentAdded, PolygonCollider, this.onAddCollider.bind(this));
24
+ event_manager.subscribe(EventTypes.ComponentRemoved, BoxCollider, this.onRemoveCollider.bind(this));
25
+ event_manager.subscribe(EventTypes.ComponentRemoved, CircleCollider, this.onRemoveCollider.bind(this));
26
+ event_manager.subscribe(EventTypes.ComponentRemoved, PolygonCollider, this.onRemoveCollider.bind(this));
27
+ if (this.enabledDebugDraw) {
28
+ this.debugGraphics = new Graphics();
29
+ this.debugGraphics.setFillStyle({ color: new Color('white') });
30
+ this.debugGraphics.width = 4;
31
+ this.debugGraphics.zIndex = 40;
32
+ }
33
+ app.stage.addChild(this.debugGraphics);
34
+ }
35
+ update(entities, events, dt) {
36
+ if (!this.enabled) {
37
+ return;
38
+ }
39
+ this.listColliders.forEach((collider) => {
40
+ if (!collider.node.active) {
41
+ this.removeColliders.push(collider);
42
+ }
43
+ });
44
+ // this.removeColliders.forEach((comp) => {
45
+ // this.listColliders = this.listColliders.filter((col) => !col.isEqual(comp) && col.node.active)
46
+ // this._contracts = this._contracts.filter((contract) => {
47
+ // const col1 = contract._collider1
48
+ // const col2 = contract._collider2
49
+ // if (col1.isEqual(comp) || !col1.node.active) {
50
+ // if (contract._touching) {
51
+ // // contract._touching = false
52
+ // if (col2.onCollisionExit) {
53
+ // col2.onCollisionExit(col1)
54
+ // }
55
+ // }
56
+ // return false
57
+ // }
58
+ // if (col2.isEqual(comp) || !col2.node.active) {
59
+ // if (contract._touching) {
60
+ // // contract._touching = false
61
+ // if (col1.onCollisionExit) col1.onCollisionExit(col2)
62
+ // }
63
+ // return false
64
+ // }
65
+ // return true
66
+ // })
67
+ // })
68
+ this.removeColliders = [];
69
+ const draw = this.enabledDebugDraw ? this.debugGraphics : undefined;
70
+ if (this.enabledDebugDraw) {
71
+ draw.clear();
72
+ }
73
+ for (const entt of entities.entities_with_components(BoxCollider)) {
74
+ const comp = entt.getComponent(BoxCollider);
75
+ comp.update(dt, draw);
76
+ }
77
+ for (const entt of entities.entities_with_components(CircleCollider)) {
78
+ const comp = entt.getComponent(CircleCollider);
79
+ comp.update(dt, draw);
80
+ }
81
+ for (const entt of entities.entities_with_components(PolygonCollider)) {
82
+ const comp = entt.getComponent(PolygonCollider);
83
+ comp.update(dt, draw);
84
+ }
85
+ if (this.enabledDebugDraw) {
86
+ // draw.clear()
87
+ // draw.removeFromParent()
88
+ // app.stage.addChild(draw)
89
+ // console.log('enabledDebugDraw', this.debugGraphics)
90
+ // this.debugGraphics.width = 4
91
+ // this.debugGraphics.circle(500, 600, 450)
92
+ this.debugGraphics.fill({ color: new Color('white'), alpha: 0.3 });
93
+ }
94
+ // console.log(this._contracts.length)
95
+ this._contracts.forEach((contract) => {
96
+ const col1 = contract._collider1;
97
+ const col2 = contract._collider2;
98
+ if (!col1.node || !col2.node || !col1.node.active || !col2.node.active) {
99
+ return;
100
+ }
101
+ const type = contract.updateState();
102
+ if (!col1 || !col2) {
103
+ return;
104
+ }
105
+ switch (type) {
106
+ case CollisionType.ENTER: {
107
+ if (col1.onCollisionEnter) {
108
+ col1.onCollisionEnter(col2);
109
+ }
110
+ if (col2.onCollisionEnter) {
111
+ col2.onCollisionEnter(col1);
112
+ }
113
+ break;
114
+ }
115
+ case CollisionType.STAY:
116
+ if (col1.onCollisionStay) {
117
+ col1.onCollisionStay(col2);
118
+ }
119
+ if (col2.onCollisionStay) {
120
+ col2.onCollisionStay(col1);
121
+ }
122
+ break;
123
+ case CollisionType.EXIT:
124
+ if (col1.onCollisionExit) {
125
+ col1.onCollisionExit(col2);
126
+ }
127
+ if (col2.onCollisionExit) {
128
+ col2.onCollisionExit(col1);
129
+ }
130
+ break;
131
+ default:
132
+ break;
133
+ }
134
+ });
135
+ }
136
+ addCollider(colliderPhysics) {
137
+ this.listColliders.forEach((col) => {
138
+ // if (shouldCollider(col, colliderPhysics)) {
139
+ this._contracts.push(new Contract(col, colliderPhysics));
140
+ // }
141
+ });
142
+ this.listColliders.push(colliderPhysics);
143
+ }
144
+ removeCollider(colliderPhysics) {
145
+ this.removeColliders.push(colliderPhysics);
146
+ }
147
+ onAddCollider({ entity, component }) {
148
+ console.log('ComponentAddedEvent', component);
149
+ const collider = entity.assign(new Collider(component));
150
+ collider.node = entity.getComponent(NodeComp);
151
+ component.node = entity.getComponent(NodeComp);
152
+ this.addCollider(collider);
153
+ }
154
+ onRemoveCollider({ entity, component }) {
155
+ console.log('ComponentRemovedEvent', component);
156
+ const collider = entity.getComponent(Collider);
157
+ this.removeCollider(collider);
158
+ }
159
+ }
@@ -0,0 +1,7 @@
1
+ import { Point } from 'pixi.js';
2
+ export declare function pointInPolygon(pos: Point, polygon: Point[]): boolean;
3
+ export declare function pointLineDistance(point: Point, start: Point, end: Point, isSegment: any): number;
4
+ export declare function polygonPolygon(pts1: Point[], pts2: Point[]): boolean;
5
+ export declare function circleCircle(p1: Point, r1: number, p2: Point, r2: number): boolean;
6
+ export declare function polygonCircle(pts1: Point[], p2: Point, r2: number): boolean;
7
+ //# sourceMappingURL=Intersection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Intersection.d.ts","sourceRoot":"","sources":["../../../src/collider/helper/Intersection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAG/B,wBAAgB,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAuB1D;AAmCD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,KAAA,UAwBlF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WA6B1D;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,WAGxE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,WAejE"}
@@ -0,0 +1,111 @@
1
+ import { getDistance, v2 } from '../../helper/utils';
2
+ export function pointInPolygon(pos, polygon) {
3
+ let inside = false;
4
+ const x = pos.x;
5
+ const y = pos.y;
6
+ // use some raycasting to test hits
7
+ // https://github.com/substack/point-in-polygon/blob/master/index.js
8
+ const length = polygon.length;
9
+ let intersect = false;
10
+ for (let i = 0, j = length - 1; i < length; j = i++) {
11
+ const xi = polygon[i].x, yi = polygon[i].y, xj = polygon[j].x, yj = polygon[j].y;
12
+ intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;
13
+ if (intersect) {
14
+ inside = !inside;
15
+ }
16
+ }
17
+ return inside;
18
+ }
19
+ function lineLine(a1, a2, b1, b2) {
20
+ // jshint camel case:false
21
+ const ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);
22
+ const ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x);
23
+ const u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);
24
+ if (u_b !== 0) {
25
+ const ua = ua_t / u_b;
26
+ const ub = ub_t / u_b;
27
+ if (ua >= 0 && ua <= 1 && ub >= 0 && ub <= 1) {
28
+ return true;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ function linePolygon(A, B, polygon) {
34
+ const length = polygon.length;
35
+ for (let i = 0; i < length; ++i) {
36
+ const C = polygon[i];
37
+ const D = polygon[(i + 1) % length];
38
+ if (lineLine(A, B, C, D)) {
39
+ return true;
40
+ }
41
+ }
42
+ return false;
43
+ }
44
+ export function pointLineDistance(point, start, end, isSegment) {
45
+ let dx = end.x - start.x;
46
+ let dy = end.y - start.y;
47
+ const d = dx * dx + dy * dy;
48
+ const t = ((point.x - start.x) * dx + (point.y - start.y) * dy) / d;
49
+ let p;
50
+ if (!isSegment) {
51
+ p = v2(start.x + t * dx, start.y + t * dy);
52
+ }
53
+ else if (d) {
54
+ if (t < 0) {
55
+ p = start;
56
+ }
57
+ else if (t > 1) {
58
+ p = end;
59
+ }
60
+ else {
61
+ p = v2(start.x + t * dx, start.y + t * dy);
62
+ }
63
+ }
64
+ else {
65
+ p = start;
66
+ }
67
+ dx = point.x - p.x;
68
+ dy = point.y - p.y;
69
+ return Math.sqrt(dx * dx + dy * dy);
70
+ }
71
+ export function polygonPolygon(pts1, pts2) {
72
+ let i = 0, l = 0;
73
+ // check if p1 pts1 intersects pts2
74
+ for (l = pts1.length; i < l; ++i) {
75
+ const a1 = pts1[i];
76
+ const a2 = pts1[(i + 1) % l];
77
+ if (linePolygon(a1, a2, pts2)) {
78
+ return true;
79
+ }
80
+ }
81
+ // check if pts1 contains pts2
82
+ for (i = 0, l = pts2.length; i < l; ++i) {
83
+ if (pointInPolygon(pts2[i], pts1)) {
84
+ return true;
85
+ }
86
+ }
87
+ // check if pts2 contains pts1
88
+ for (i = 0, l = pts1.length; i < l; ++i) {
89
+ if (pointInPolygon(pts1[i], pts2)) {
90
+ return true;
91
+ }
92
+ }
93
+ return false;
94
+ }
95
+ export function circleCircle(p1, r1, p2, r2) {
96
+ const d = getDistance(p1, p2);
97
+ return d < r1 + r2;
98
+ }
99
+ export function polygonCircle(pts1, p2, r2) {
100
+ if (pointInPolygon(p2, pts1)) {
101
+ return true;
102
+ }
103
+ for (let i = 0, l = pts1.length; i < l; i++) {
104
+ const start = i === 0 ? pts1[l - 1] : pts1[i - 1];
105
+ const end = pts1[i];
106
+ if (pointLineDistance(p2, start, end, true) < r2) {
107
+ return true;
108
+ }
109
+ }
110
+ return false;
111
+ }
@@ -0,0 +1,3 @@
1
+ import { Collider } from '../CollideComponent';
2
+ export declare function shouldCollider(colA: Collider, colB: Collider): boolean;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/collider/helper/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAG9C,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,WAQ5D"}
@@ -0,0 +1,11 @@
1
+ import { GameWorld } from '../../base';
2
+ import { CollideSystem } from '../CollideSystem';
3
+ export function shouldCollider(colA, colB) {
4
+ const groupA = colA.node.group;
5
+ const groupB = colB.node.group;
6
+ if (groupA === undefined || groupB === undefined) {
7
+ return true;
8
+ }
9
+ const { colliderMatrix } = GameWorld.Instance.systems.get(CollideSystem);
10
+ return colliderMatrix[groupA][groupB];
11
+ }
@@ -0,0 +1,3 @@
1
+ export * from './CollideComponent';
2
+ export * from './CollideSystem';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collider/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './CollideComponent';
2
+ export * from './CollideSystem';
@@ -1,11 +1,12 @@
1
- import { EnhancedComponent } from '@safe-engine/core';
2
1
  import { Container } from 'pixi.js';
2
+ import { EnhancedComponent } from '../base';
3
3
  import { NodeComp } from './NodeComp';
4
- export declare class NoRenderComponentX<C extends Container = Container> extends EnhancedComponent<NodeComp<C>> {
5
- static create(data?: any): NoRenderComponentX<Container<import("pixi.js").ContainerChild>>;
4
+ export declare class NoRenderComponentX<Props = Object, C extends Container = Container> extends EnhancedComponent<Props, NodeComp<C>> {
5
+ static create(data?: any): NoRenderComponentX<any, Container<import("pixi.js").ContainerChild>>;
6
6
  }
7
- export declare class ComponentX<C extends Container = Container> extends EnhancedComponent<NodeComp<C>> {
7
+ export declare class ComponentX<Props = Object, C extends Container = Container> extends EnhancedComponent<Props, NodeComp<C>> {
8
8
  static hasRender: boolean;
9
- static create(data?: any): ComponentX<Container<import("pixi.js").ContainerChild>>;
9
+ render?(data?: Props): any;
10
+ static create(data?: any): any;
10
11
  }
11
12
  //# sourceMappingURL=BaseComponent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BaseComponent.d.ts","sourceRoot":"","sources":["../../src/components/BaseComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAa,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,qBAAa,kBAAkB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG;CAGzB;AAED,qBAAa,UAAU,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,CAAC,SAAS,UAAO;IACvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG;CAMzB"}
1
+ {"version":3,"file":"BaseComponent.d.ts","sourceRoot":"","sources":["../../src/components/BaseComponent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAa,MAAM,SAAS,CAAA;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,qBAAa,kBAAkB,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5H,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG;CAGzB;AAED,qBAAa,UAAU,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC,SAAS,SAAS,GAAG,SAAS,CAAE,SAAQ,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpH,MAAM,CAAC,SAAS,UAAO;IACvB,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,GAAG;IAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG;CAQzB"}
@@ -1,20 +1,18 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ComponentX = exports.NoRenderComponentX = void 0;
4
- const core_1 = require("@safe-engine/core");
5
- class NoRenderComponentX extends core_1.EnhancedComponent {
1
+ import { EnhancedComponent, GameWorld } from '../base';
2
+ export class NoRenderComponentX extends EnhancedComponent {
6
3
  static create(data) {
7
4
  return new this(data);
8
5
  }
9
6
  }
10
- exports.NoRenderComponentX = NoRenderComponentX;
11
- class ComponentX extends core_1.EnhancedComponent {
7
+ export class ComponentX extends EnhancedComponent {
12
8
  static create(data) {
13
- const world = core_1.GameWorld.Instance;
9
+ // console.log('create', this, this.prototype['render'])
10
+ if (this.prototype.render)
11
+ return this.prototype.render(data);
12
+ const world = GameWorld.Instance;
14
13
  const root = world.entities.create();
15
14
  const comp = root.assign(new this(data));
16
15
  return comp;
17
16
  }
18
17
  }
19
- exports.ComponentX = ComponentX;
20
18
  ComponentX.hasRender = true;