2016-05-29 4 views
1

Я попытался сделать небольшую «игру» с обнаружением столкновения.Обнаружение столкновений с прямоугольниками

Проблема в том, что в некоторых случаях объекты просто проходят. Я полностью слеп к делу.

Я попытался создать свое собственное обнаружение, который комментировал, а потом я попытался это:

Code sample as fiddle

function rectanglesIntersect(minAx, minAy, maxAx, maxAy, minBx, minBy, maxBx, maxBy) { 
    var aLeftOfB = maxAx < minBx; 
    var aRightOfB = minAx > maxBx; 
    var aAboveB = minAy > maxBy; 
    var aBelowB = maxAy < minBy; 

    return !(aLeftOfB || aRightOfB || aAboveB || aBelowB); 
} 
+0

Если вы хотите, чтобы он двигался медленнее, просто измените FPS, и вы можете легко добавить меньше предметов в buttom примера. – Kiksen

+0

Быстро перемещающиеся предметы могут полностью пройти через препятствие во время одного хода - это называется «туннелирование». Здесь показан предыдущий [Q & A] (http://stackoverflow.com/questions/34607871/how-to-create-obstacles-in-canvas), показывающий, как найти начальную точку столкновения. – markE

+0

Если вы смотрите мою демоверсию, они когда-нибудь сталкиваются, когда они хорошо внутри друг друга? И я делаю свои проверки, прежде чем они перейдут к следующему кадру? Значит, они никогда не должны запыхаться? – Kiksen

ответ

3

К счастью, ваши прямоугольники имеют эти упрощающие качества при движении:

  • Они перемещаются только в направлении Y (вверх или вниз).
  • Все они перемещаются со скоростью 30 пикселей за ход.

Таким образом, вы можете определить, является ли & где пара Прямоугольник будет сталкиваться, как это:

  1. В начала двигаться, вычислить, если пара прямоугольников может возможно столкнуться при тестировании, если они вертикально выровнены.

    rect1.x > rect2.x && rect1.x < rect2.x + rect2.width; 
    
  2. Если пара прямоугольников двигаются по направлению друг к другу, вычислить, если пара находится в пределах 60 пикселей по вертикали друг от друга. 60 важно, потому что каждый прямоугольник может перемещаться на 30 пикселей на каждый ход, поэтому прямая пара может закрываться друг на друга на 30 + 30 = 60 пикселей на ход.

    var willCollideThisMove = Math.abs(rect1.y-rect2.y)<=60; 
    
  3. Если пара столкнется, то пара будет сталкиваться в средней точке их разности расстояний:

    var collisionY = Math.min(rect1.y,rect2.y)+Math.abs(rect1.y-rect2.y)/2; 
    

ли эти 3 вычисления для всех пар Rect.

+1

Спасибо за отзыв :) Только то, что мне нужно было идти. – Kiksen