像素颜色的Alpha值和使用SDL的Per-Pixel-Collision

时间:2015-01-22 20:33:28

标签: c++ sdl collision-detection

我正在尝试将每像素碰撞实现到我的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;
                }

            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

好吧,我做的错误是愚蠢的。游戏崩溃的原因是表面是空的,表面的成员也是如此,因为在我的Texture类中,我处理纹理的初始化,我称之为
 SDL_FreeSurface() 这就是无效的原因。 pixelFormat,pixelColor值等等,它们都通过FeeSurface设置为0。现在我解决了这个问题,我只是想把它写下来给其他可能犯同样错误的人。