C++ 从SDL_曲面读取像素并转换为颜色值

C++ 从SDL_曲面读取像素并转换为颜色值,c++,2d,sdl,pixel,alpha,C++,2d,Sdl,Pixel,Alpha,我真的不知道出了什么问题(主要是因为我不知道给我一个错误的那行是怎么回事) 我想我不必向您展示那么多代码。 我正在做的是,我试图得到一个像素的RGBA值,看看Alpha值有多大。 我用这个来确定它们的矩形内是否有碰撞 这就是我所拥有的: bool Texture2D::GetPixelAlphaValue(Vector2 pixel) { int bpp = surface->format->BytesPerPixel; Uint8* p = (Uint8*) surface->

我真的不知道出了什么问题(主要是因为我不知道给我一个错误的那行是怎么回事)

我想我不必向您展示那么多代码。 我正在做的是,我试图得到一个像素的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.
这条线我不明白,有人能解释一下这条线在做什么,我如何解决这个问题吗

问候


Markus

访问冲突表示您试图访问不属于您的内存。在本例中,您可能在
x
y
超出范围(大于图像大小或负片)的情况下调用该函数

在对
x
y
进行指针运算之前,应该先检查它们的值,然后才能更优雅地处理该错误(这可能只是意味着报告哪个值是错误的,然后无论如何都要中止,也可能意味着向调用者报告该错误)

错误的另一个可能来源是发生错误的he线。它将指向Uint8的指针重新解释为指向Uint32的指针,并取消对它的引用。实际上,它将该地址的四个字节读入
pixelcolor
。请注意,此转换仅在
bpp
为4时有效,此外,像素阵列已针对UInt32适当对齐。对齐问题不太可能在基于x86的平台上导致错误(x86通常只会对未对齐的指针造成性能影响),但bpp问题可能会在阵列的末尾发生。干净(但通常较慢)的方法是单独读取字节并使用位移位组合它们,如下所示:

UInt32 pixelcolor = 0;
for (int i = 0; i < bpp; ++i)
{
  pixelcolor <<= 8;
  pixelcolor += *p++;
}
UInt32像素颜色=0;
对于(int i=0;ipixelcolor这真的是你的真实代码吗?因为我很惊讶它能编译。在第4行中,你给
Uint8
的指针分配了一个整数。p跳过了surface->pixels?你的代码看起来非常类似:你是否按照它所说的那样先锁定了surface?如果你与示例代码。您希望将曲面->像素强制转换为a(Uint8*),而不是a(Uint8*)。对不起,您是对的,我在编写问题时漏掉了*,它在我的代码中。提示:通常最好使用实际代码的复制/粘贴。这样您就不会添加新错误(或者在极端情况下,甚至意外地纠正了实际错误,让任何人都不知道代码到底出了什么问题)。嗯,我能说的是,只有当两个像素颜色都不是255 alpha时,错误才会发生。我试着检查x和y,但没有任何区别。