我正在尝试将每像素碰撞实现到我的SDL游戏框架中。我在查找曲面中特定像素的alpha值(RGBA)时遇到问题。我正在使用SDL功能。
SDL_GetRGBA(pixelColor, pixelFormat, &red, &green, &blue, &alpha);
游戏崩溃: 当pixelColor变量将被初始化时游戏崩溃(参见代码中的注释)。似乎问题与* p指针和pixelColor变量有关,后者后来用作SDL_GetRGBA()方法中的参数。
变量bpp :我得到变量bpp的值108,有时它得到106,在某些情况下,bpp(每像素的字节数)是255.但这些值是完全错误的他们不是吗?它应该是每像素1或2或3或4个字节...(http://wiki.libsdl.org/SDL_PixelFormat)
p:0x00c1e11c {???}
pixelFormat:SDL2.dll!0x6c80d62c {format = 10746688 palette = 0x00a3fb40}
(这些是其他重要变量的值)
这是我完整的函数,用于获取碰撞检测的像素的alpha值。部分内容取自本教程(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;
}
}
}
}
}
答案 0 :(得分:2)
好吧,我做的错误是愚蠢的。游戏崩溃的原因是表面是空的,表面的成员也是如此,因为在我的Texture类中,我处理纹理的初始化,我称之为
SDL_FreeSurface()
这就是无效的原因。 pixelFormat,pixelColor值等等,它们都通过FeeSurface设置为0。现在我解决了这个问题,我只是想把它写下来给其他可能犯同样错误的人。