2D障碍物碰撞

时间:2017-08-25 16:54:44

标签: c++ collision-detection collision

您好我正在尝试进行2d碰撞,但我没有让它工作 我在做:

if (collider.posX + collider.sizeX >= obstacle.posX && obstacle.posX + obstacle.sizeX >= collider.posX && collider.posY + collider.sizeY >= obstacle.posY)

障碍物无法在y轴上移动,所以这就是我只检查

的原因
collider.posY + 50 >= obstacle.posY

碰撞有效但它们只在障碍物在对撞机中占一半时开始

2 个答案:

答案 0 :(得分:2)

怎么样:

if( obstacle.posX >= collider.posX && 
    obstacle.posX <= collider.posX + collider.sizeX &&
    obstacle.posY >= collider.posY && 
    obstacle.posY <= collider.posY + collider.sizeY
  )

此代码应检查障碍点是否与碰撞器矩形相交 这是更好的解决方案,因为它可以检测2个矩形之间的重叠:

if ( obstacle.posX <= collider.posX + collider.sizeX &&
     obstacle.posX + obstacle.sizeX >= collider.posX &&
     obstacle.posY <= collider.posY + collider.sizeY &&
     obstacle.posY + obstacle.sizeY >= collider.posY )

答案 1 :(得分:0)

您遇到了逻辑错误,如以下代码所示:

collider.posX + collider.sizeX >= obstacle.posX

假设两个碰撞对象是圆形,其位置是它们的中心点。第一个物体在正X方向上移动而第二个物体是静止的(静止的)。你需要检查第一个物体的X位置加上它的半径(不是直径)是否接触到第二个物体的X位置减去它的半径。

示例代码:

collider.posX + (collider.sizeX / 2) >= obstacle.posX - (obstacle.sizeX / 2)

注意:上述不等式假定collider.sizeX代表collider的直径。

据推测,稍后您还需要检查第一个对象是否通过了第二个对象。由于上述不等式仅考虑具有增加的X位置且其X位置小于第二对象的X位置的第一对象。