c++ - 二维边界框碰撞

标签 c++ 2d bounding-box

我在编写的小型 2D 游戏中遇到一些碰撞问题。我目前正在研究一个函数,我想找出玩家角色是否与方 block 发生碰撞,以及他与方 block 的哪一侧相撞。

目前我有类似(伪代码)的东西:

if(PLAYER_BOX IS WITHIN THE BLOCKS Y_RANGE)
{
    if(PLAYER_BOX_RIGHT_SIDE >= BLOCK_LEFT_SIDE && PLAYER_BOX_RIGHT_SIDE <= BLOCK_RIGHT_SIDE)
    {
        return LEFT;
    }
    else if(PLAYER_LEFT_SIDE <= BLOCK_RIGHT_SIDE && PLAYER_LEFT_SIDE >= BLOCK_LEFT_SIDE)
    {
        return RIGHT;
    }
}
else if(PLAYER_BOX IS WITHIN BLOCK X_RANGE)
{
    if(PLAYER_BOTTOM_SIDE >= BLOCK_TOP_SIDE && PLAYER_BOTTOM_SIDE <= BLOCK_BOTTOM_SIDE)
    {
        return ABOVE;
    }
    else if(PLAYER_TOP_SIDE <= BLOCK_BOTTOM_SIDE && PLAYER_TOP_SIDE >= BLOCK_TOP_SIDE)
    {
        return BELOW;
    }
 }

我这里有逻辑错误吗?或者我只是在我的代码中写错了什么?

ABOVE 碰撞有效,但它无法识别应该识别的侧向碰撞,有时它会识别不应该识别的碰撞。

该游戏是《 super 马里奥》的克隆版,因此它是一款横版 2D 平台游戏。

最佳答案

我猜问题是方向。

您真正想要做的是首先考虑“玩家”方向,然后进行检查。

如果您不知道玩家向哪个方向移动,您可能会根据 Sprite 移动的“速度”获得一个错误命中数。

例如,如果您有移动方向(从左到右),那么您的代码可能如下所示:

select movedir
(
   case up:
     //check if hitting bottom of box
     break;
   case down:
     //check if hitting top of box

    etc

}

关于c++ - 二维边界框碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3865737/

相关文章:

c++ - 过剩的简单二维动画

matlab:二维线图水平线

javascript - 为多维数组计算 "bounding box"

c++ - do-while 无限循环 cout,忽略 cin

c++ - std::array over c 样式数组

c++ - 什么时候将 unique_ptr 与 STL 容器一起使用才有意义? (C++11)

text - 使用@font-face 时,SVG 文本边界框因浏览器而异?

c++ - 为什么这个线程不知道它是谁?

c# - 绕另一点和 X 轴旋转点

javascript - svg<g>元素的BBox计算