2D障碍碰撞
2D obstacle 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
碰撞有效,但它们仅在障碍物位于对撞机中的一半时才开始
您运行陷入逻辑错误,可通过以下代码看出:
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 位置。
怎么样:
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 )
嗨,我正在尝试进行 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
碰撞有效,但它们仅在障碍物位于对撞机中的一半时才开始
您运行陷入逻辑错误,可通过以下代码看出:
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 位置。
怎么样:
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 )