我真的不知道出了什么问题(主要是因为我不知道哪条线会给我一个错误)。
我认为我不得不向你展示那么多代码。 我正在做的是,我正在尝试获取像素的RGBA值,以查看Alpha值有多大。 我用它来确定它们的矩形内是否有碰撞。
这就是我所拥有的:
bool Texture2D::GetPixelAlphaValue(Vector2 pixel)
{
int bpp = surface->format->BytesPerPixel;
Uint8* p = (Uint8*) surface->pixels + (int) pixel.y * surface->pitch + (int) pixel.x * bpp);
Uint32 pixelColor = *(Uint32*)p;
Uint8 red, green, blue, alpha;
SDL_GetRGBA(pixelColor, surface->format, &red, &green, &blue, &alpha);
return alpha > 250;
}
我很确定我的碰撞是好的,我做的是检查矩形是否相交,我创建一个交叉点的矩形,然后检查交叉矩形内的每个像素。
这导致一旦我在屏幕上有一个像素完美碰撞,游戏崩溃,我得到一个箭头指向:
Uint32 pixelColor = *(Uint32*)p;
错误:
Unhandled exception at 0x000393b4 in OpenGLSDLTest.exe: 0xC0000005: Access violation reading location 0x063b6fd0.
这是我不理解的那条线,有人可以解释一下这条线在做什么以及如何解决这个问题?
亲切的问候
马库斯
答案 0 :(得分:0)
访问冲突意味着您正在尝试访问不属于您的内存。在这种情况下,您可能在x
或y
超出范围(大于图像大小或负数)时调用该函数。
在对它们进行指针运算之前,你应该检查x
和y
的值,然后你可以更优雅地处理这个错误(这可能仅仅意味着报告哪个值是错误的,然后无论如何都会中止,或者它可能意味着将错误报告给调用者。)
另一个可能的错误来源是发生错误的行。它将指向Uint8的指针重新解释为指向Uint32的指针,并将其解除引用。实际上,它将查看该地址的四个字节读入pixelcolor
。请注意,此强制转换仅在bpp
为4且有效对齐UInt32时才有效。对齐问题不太可能在基于x86的平台上引起错误(x86通常只会导致未对齐指针的性能损失),但bpp问题可能会在数组末尾出现。干净(但通常较慢)的方法是分别读取字节并使用位移组成它们,如下所示:
UInt32 pixelcolor = 0;
for (int i = 0; i < bpp; ++i)
{
pixelcolor <<= 8;
pixelcolor += *p++;
}