C++ SDL中的每像素二维圆形碰撞检测

C++ SDL中的每像素二维圆形碰撞检测,c++,gcc,ubuntu,sdl,collision-detection,C++,Gcc,Ubuntu,Sdl,Collision Detection,好吧,直截了当地说,我在学习SDL时使用了指南,我在每像素碰撞部分遇到了困难。我对此的实现与指南略有不同,它导致了一些不必要的问题。问题是移动的球直接穿过静止的球(这意味着它是实心的,并且像你所期望的那样阻挡移动的球)。我知道矩形碰撞框位于正确的位置,因为我已将移动球重新定位为白色(ball.bmp加载为红色),将静止球重新定位为蓝色,每个球顶部的碰撞框已重新定位 我的碰撞检测功能如下 bool checkCol(std::vector<SDL_Rect> A,std::vector

好吧,直截了当地说,我在学习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;
}
bool checkCol(标准::向量A,标准::向量B){
int TOP1、TOP2;
int BOTTOM1,BOTTOM2;
int LEFT1,LEFT2;
int RIGHT1,RIGHT2;
对于(int i=0;i=BOTTOM2){返回false;}

如果(BOTTOM1看起来算法逻辑不正确。当您有一个条件列表,并且希望检查所有条件是否都为false时,您不应该在发现一个条件为false时立即执行
返回false;

看起来算法逻辑不正确。当您有一个条件列表,并且希望检查所有条件是否为false时l其中一个是假的,一旦你发现一个是假的,你就不应该
返回false;

你多久检查一次这些球的碰撞?我的意思是,可能会出现这样的情况,第一帧的球还没有碰撞,下一帧的球已经没有碰撞。检查它们的速度和大小,应该有
 speed*timeStep
@yurymik我不确定我是否遵循了。你多久检查一次这些球的碰撞?我的意思是,可能会出现这样的情况:在第一帧球还没有碰撞,在下一帧球已经没有碰撞。检查它们的速度和大小,应该有
speed*timeStep
@yurymik I“我不确定我是否理解。不是真的。它检查分隔轴:如果你能在两个矩形之间画一条线而不与它们相交=>它们没有冲突。不是真的。它检查分隔轴:如果你能在两个矩形之间画一条线而不与它们相交=>它们没有冲突。”。