Альфа-значение цвета пикселей и Per-Pixel-Collision с использованием SDL

Я пытаюсь внедрить попиксельное столкновение в мою игровую среду SDL. У меня проблема с определением альфа-значения (RGBA) определенного пикселя на поверхности. Я использую функцию SDL, чтобы сделать это.

SDL_GetRGBA(pixelColor, pixelFormat, &red, &green, &blue, &alpha);

Игра вылетает: игра вылетает, когда инициализируется переменная pixelColor (см. Комментарии в коде). Кажется, что проблема связана с указателем *p и переменной pixelColor, которая позже используется в качестве параметра в методе SDL_GetRGBA().

переменная bpp: я получаю значение 108 для переменной bpp, иногда оно равно 106, а в некоторых случаях bpp (Bytes per Pixel) равно 255. Но эти значения совершенно неверны, не так ли? Это должен быть 1 или 2 или 3 или 4 байта на пиксель... ( http://wiki.libsdl.org/SDL_PixelFormat)

p: 0x00c1e11c {???}
pixelFormat: SDL2.dll! 0x6c80d62c {format = 10746688 palette = 0x00a3fb40}

(Это значения других важных переменных)

Вот моя полная функция для получения альфа-значения пикселя для обнаружения столкновений. Части этого взяты из этого руководства ( http://www.sdltutorials.com/sdl-per-pixel-collision).

int CollisionHandler::GetAlphaXY(SDL_Surface* surface, int x, int y)
{
    // get the specific pixel for checking the alpha value at x/y

    SDL_PixelFormat* pixelFormat = surface->format;
    int bpp = pixelFormat->BytesPerPixel;   

    Uint8* p = (Uint8*)surface->pixels + y * surface->pitch + x * bpp;

    // ! here the game crashes
    Uint32 pixelColor = *p;     

    // get the RGBA values

    Uint8 red, green, blue, alpha;

    // this function fails, sometimes the game crashes here
    SDL_GetRGBA(pixelColor, pixelFormat, &red, &green, &blue, &alpha);  

    return alpha;
}

Я думаю, что код правильный, но я получаю ошибку во время выполнения, когда два объекта, которые я использую для тестирования, сталкиваются. Программа не падает, когда столкновение за пиксель должно заметить столкновение, а скорее, когда сталкиваются прямоугольники.

Вот так выглядит мой метод Per-Pixel-Collision:

bool CollisionHandler::Per_Pixel_Collision(GameObject* obj1, GameObject* obj2)
{
    // only do pixel collision if rectangles collide

    if (Rect_Collision(obj1, obj2))
    {   
        int top = max(top1, top2);
        int left = max(left1, left2);
        int bottom = min(bottom1, bottom2);
        int right = min(right1, right2);

        // from the top to the bottom 

        for (int y = top; y < bottom; y++)
        {
            // from the left to the right 

            for (int x = left; x < right; x++)
            {
                // if both alpha values are zero -> both pixels transparent

                if (GetAlphaXY(obj1->getTexture().getSurface(), x, y) == 0 && GetAlphaXY(obj2->getTexture().getSurface(), x, y) == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }

            }
        }
    }
}

1 ответ

Решение

Хорошо, ошибка, которую я сделал, глупа. Причина, по которой игра вылетала, состоит в том, что поверхность была пуста, как и члены поверхности, потому что в моем классе текстур, где я занимаюсь инициализацией текстур, я вызывал
SDL_FreeSurface()Вот почему ничего не работает. PixelFormat, значения pixelColor и т. Д. Все они были установлены в 0 через FeeSurface. Теперь я решил проблему, я просто хотел записать это для других людей, которые, возможно, сделали ту же ошибку.

Другие вопросы по тегам