2D пиксельное круговое обнаружение столкновений в SDL - PullRequest
1 голос
/ 24 декабря 2010

Ладно, прямо к нему, я использую это руководство, когда изучаю 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;
}

здесь - полный исходный код (слишком большой для размещения здесь) и исполняемый файл (linux).

Может кто-нибудь сказать мне, где я ошибся?

[править] Игнорировать прямоугольник посередине.

1 Ответ

1 голос
/ 24 декабря 2010

Похоже, логика алгоритма неверна. Если у вас есть список условий, и вы хотите проверить, что все они ложные, вам не следует делать return false;, как только вы нашли один , который ложен.

...