Альфа-значение цвета пикселей и 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. Теперь я решил проблему, я просто хотел записать это для других людей, которые, возможно, сделали ту же ошибку.