【发布时间】:2011-11-13 11:35:11
【问题描述】:
我真的不知道出了什么问题(主要是因为我不知道给我错误的那一行是做什么的)。
我认为我不必向您展示那么多代码。 我正在做的是尝试获取像素的 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.
这是我不明白的线路,谁能解释一下这条线路在做什么以及我该如何解决这个问题?
亲切的问候
马库斯
【问题讨论】:
-
这真的是你的真实代码吗?因为我很惊讶它完全可以编译。在第 4 行,您将一个整数分配给指向
Uint8的指针。 -
p 正在跳过表面->像素?
-
您的代码看起来与此非常相似:Pixel_Access 您是否像它说的那样先锁定了表面?如果您与示例代码进行比较,您的代码中也存在错误。您想将表面->像素投射到 (Uint8*),而不是 (Uint8)。
-
对不起,你是对的,我写问题时错过了*,它在我的代码中。
-
提示:通常最好从实际代码中使用复制/粘贴。这样你就不会添加新的错误(或者在极端情况下甚至不小心纠正了实际错误,让任何人不知道你的代码应该有什么问题)。