c++ - SDL 中的每像素 2D 圆形碰撞检测

标签 c++ gcc ubuntu sdl collision-detection

好吧,直说吧,我正在使用 this指导我学习 SDL,我在每像素碰撞部分遇到困难。我对此的实现与指南略有不同,它会导致一些不需要的问题。问题是移动的球直接穿过静止的球(正如您所期望的那样,它应该是坚固的并阻挡移动的球)。我知道矩形碰撞盒在正确的位置,因为我已经将移动的球重新着色为白色(ball.bmp 加载为红色)并将静止的球重新着色为蓝色,每个球顶部的碰撞盒已重新着色。

我的碰撞检测函数如下

bool checkCol(std::vector<SDL_Rect> A,std::vector<SDL_Rect> B){
    int TOP1,           TOP2;
    int BOTTOM1,    BOTTOM2;
    int LEFT1,          LEFT2;
    int RIGHT1,     RIGHT2;
    for (int i = 0; i < A.size(); i++){
        TOP1         =      A[ i ].y;
        BOTTOM1  =      A[ i ].y + A[ i ].h;
        LEFT1        =      A[ i ].x;
        RIGHT1       =      A[ i ].x + A[ i ].w;
        for (int j = 0; j < B.size(); j++){
            TOP2         =      B[ i ].y;
            BOTTOM2  =      B[ i ].y + B[ i ].h;
            LEFT2        =      B[ i ].x;
            RIGHT2       =      B[ i ].x + B[ i ].w;

            if ( RIGHT1 <= LEFT2 ){ return false; }
            if ( LEFT1 >= RIGHT2 ){ return false; }
            if ( TOP1 >= BOTTOM2 ){ return false; }
            if ( BOTTOM1 <= TOP2 ){ return false; }
        }
    }
    return true;
}

here是完整的源代码(太大而无法在此处发布)和可执行文件(linux)。

有人可以告诉我我哪里做错了吗?

[编辑] 忽略中间的矩形。

最佳答案

看起来算法逻辑不正确。当您有一个条件列表并且想要检查所有条件是否为假时,您不应该在找到条件后立即执行return false; 这是错误的。

关于c++ - SDL 中的每像素 2D 圆形碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4527216/

相关文章:

c++ - 如何在 C++ 中反转 2 block 中的字符串?

c++ - mqd_t,发送和接收消息

c - 如何使用 GCC/Clang 编译器了解/限制 C 程序中的静态堆栈大小?

c++ - 如何使 g++ 导致异常而不是警告格式错误

c++ - 如何将 QVideoWidget 设置为全屏并在全屏小部件中设置音量 slider ?

c++ - 如何调用存储在 map 中的仿函数?

c - 链接 GCC 构建的静态库时,MSVC 项目缺少 "__popcountdi2"

php - 以 root/普通用户身份运行 eJabberd 注册用户命令

macos - 如何抽象ant-contrib跨平台?

linux - 如何显示以特定字母开头和结尾的文件名?