Skip to content

Commit b7f1888

Browse files
committed
Work out the dominant face even if not intersecting, or if perfectly aligned
1 parent 9b65f1b commit b7f1888

1 file changed

Lines changed: 40 additions & 11 deletions

File tree

src/physics/arcade/CollisionInfo.js

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ var CollisionInfo = {
2121
body2 = data.body2;
2222
}
2323

24+
var intersects = IntersectsRect(body1, body2, 0);
25+
var touching = (intersects) ? true : IntersectsRect(body1, body2, 1);
26+
27+
var intersectsX = intersects;
28+
var intersectsY = intersects;
29+
2430
var overlapX = 0;
2531
var overlapY = 0;
2632

@@ -41,14 +47,33 @@ var CollisionInfo = {
4147
var leftFace = (distanceX1 > distanceX2 && prevDistanceX1 > prevDistanceX2);
4248
var topFace = (distanceY1 > distanceY2 && prevDistanceY1 > prevDistanceY2);
4349

44-
var faceX = CONST.FACING_NONE;
45-
var faceY = CONST.FACING_NONE;
50+
var touchingX = false;
51+
var touchingY = false;
4652

47-
var intersects = IntersectsRect(body1, body2, 0);
48-
var touching = (intersects) ? true : IntersectsRect(body1, body2, 1);
53+
if (body1.x === body2.right)
54+
{
55+
leftFace = true;
56+
touchingX = true;
57+
}
58+
else if (body1.right === body2.x)
59+
{
60+
leftFace = false;
61+
touchingX = true;
62+
}
4963

50-
var intersectsX = intersects;
51-
var intersectsY = intersects;
64+
if (body1.y === body2.bottom)
65+
{
66+
topFace = true;
67+
touchingY = true;
68+
}
69+
else if (body1.bottom === body2.y)
70+
{
71+
topFace = false;
72+
touchingY = true;
73+
}
74+
75+
var faceX = CONST.FACING_NONE;
76+
var faceY = CONST.FACING_NONE;
5277

5378
var share = 0;
5479
var shareX1 = 0;
@@ -182,33 +207,37 @@ var CollisionInfo = {
182207
}
183208
}
184209

185-
var forceX = (overlapX < overlapY);
210+
var forceX = (touchingX || overlapX < overlapY);
186211
var face = (forceX) ? faceX : faceY;
187212

188213
if (forceX && FuzzyEqual(overlapX, 0))
189214
{
190-
// Difference is too small to warrant considering
215+
// Difference is too small to warrant considering separation
191216
overlapX = 0;
192217
shareX1 = 0;
193218
shareX2 = 0;
194219
intersects = false;
195220
intersectsX = false;
221+
face = faceX;
196222
}
197223

198224
if (!forceX && FuzzyEqual(overlapY, 0))
199225
{
200-
// Difference is too small to warrant considering
226+
// Difference is too small to warrant considering separation
201227
overlapY = 0;
202228
shareY1 = 0;
203229
shareY2 = 0;
204230
intersects = false;
205231
intersectsY = false;
232+
face = faceY;
206233
}
207234

208235
var dump = function ()
209236
{
210-
console.log('body1:', body1.gameObject.name, 'vs body2:', body2.gameObject.name);
237+
console.log('body1:', body1.gameObject.name, 'vs body2:', body2.gameObject.name, 'on face', face, faceX, faceY);
211238
console.log('intersects?', intersects, 'xy', intersectsX, intersectsY, 'touching?', touching);
239+
console.log('body1 x:', body1.x, 'right:', body1.right, 'body2 x:', body2.x, 'right:', body2.right);
240+
console.log('body1 y:', body1.y, 'bottom:', body1.bottom, 'body2 y:', body2.y, 'bottom:', body2.bottom);
212241

213242
if (forceX)
214243
{
@@ -219,7 +248,7 @@ var CollisionInfo = {
219248
console.log('body1 overlaps body2 on the ' + ((faceY === CONST.FACING_UP) ? 'top' : 'bottom') + ' face');
220249
}
221250

222-
console.log('overlapX:', overlapX, 'overlayY:', overlapY);
251+
console.log('overlapX:', overlapX, 'overlapY:', overlapY);
223252
console.log('shareX1:', shareX1, 'shareX2:', shareX2);
224253
console.log('shareY1:', shareY1, 'shareY2:', shareY2);
225254
console.log('x compare (CI): ', body1.right, 'body2', body2.x, '=', (body1.right - body2.x));

0 commit comments

Comments
 (0)