C SDL2-读取用于碰撞检测的像素
我目前正在尝试编写一个小游戏,其中包括在迷宫中移动一个点。我没有用矩形来构建迷宫,而是决定简单地创建一个迷宫的PNG图像,并将其加载为一个曲面,我还让点在屏幕上移动 现在,我一直在努力确保圆点(更像一个小盒子)保持某种颜色,并防止它移动到墙上。我试图在运动前读取像素,看看它是黑色(墙)还是白色(空白)。我已经注意到了SDL_renderAdpixels的功能,但我似乎无法使其正常工作:C SDL2-读取用于碰撞检测的像素,c,sdl-2,C,Sdl 2,我目前正在尝试编写一个小游戏,其中包括在迷宫中移动一个点。我没有用矩形来构建迷宫,而是决定简单地创建一个迷宫的PNG图像,并将其加载为一个曲面,我还让点在屏幕上移动 现在,我一直在努力确保圆点(更像一个小盒子)保持某种颜色,并防止它移动到墙上。我试图在运动前读取像素,看看它是黑色(墙)还是白色(空白)。我已经注意到了SDL_renderAdpixels的功能,但我似乎无法使其正常工作: int w, h, access; void* pixels;
int w, h, access;
void* pixels;
Uint32 format;
const char* s;
SDL_QueryTexture(map->texture, &format, &access, &w, &h);
// Access = 0; width = 900; height = 720
s = SDL_GetPixelFormatName(format);
// Format: ARGB8888
SDL_Log("%s", s);
// Now I got pitch as: 900 * 32 = 28800
w = SDL_RenderReadPixels(map->renderer, NULL, 0, pixels, 28800);
我总是遇到一个分割错误。现在,我不完全确定这是否是实现我正在尝试的目标的最简单的方法。我似乎在SDL2库中也找不到一个更简单的函数来实现这一点,而且我还没有找到解决方案
谢谢,
SDL\u renderAdpixels
将结果保存到未初始化的第四个参数(像素)。SDL然后将像素写到“某处”,这很幸运地导致了分割错误。您必须为生成的像素(静态缓冲区、堆栈缓冲区、malloc等)提供空间
另请注意,此操作相当慢。SDL\u RendereAdPixels
将结果保存到未初始化的第四个参数(像素)。SDL然后将像素写到“某处”,这很幸运地导致了分割错误。您必须为生成的像素(静态缓冲区、堆栈缓冲区、malloc等)提供空间
另请注意,此操作相当慢。在中编辑。如果您只是渲染背景的PNG纹理,我认为,如果要检查CPU上的冲突,最好是在CPU上保留一份图像副本,而不是使用glReadPixels
。在a中编辑。如果只是渲染背景的PNG纹理,如果要检查CPU上的冲突,我认为更好的方法是在CPU上保留一份图像副本,而不是用glReadPixels
暂停管道。你用像素来指出问题绝对正确,我刚刚尝试用NULL
替换像素
,没有分割错误。然而,即使我试图通过以下方式分配空间:pixels=(void*)malloc(30000)代码>---仍在获取seg。过错不知道如何分配这个,我尝试了几种不同的方法。你的音高看起来不正确(应该是宽度*字节/像素+填充,我高度怀疑RGBA8是32字节/像素-应该是4),30000太少-你请求了整个纹理,所以你至少需要音高*高度字节(例如,在我心不在焉的计算中为2592000)。正如对调用malloc()
:您不应该需要强制转换。即使在分配int*
时,您也不需要强制转换,但是malloc()<代码> >返回代码>空白>代码>,不必在这里进行,但不需要考虑。用C++我相信你必须使用CAST,但是他们说无论如何你都应该在C++中使用<代码>新的< /代码>。你绝对正确地用“代码>像素< /COD>来指出这个问题,我只是尝试替换<代码> PIX。els
带有NULL
并且没有分段错误。但是,即使我尝试按以下方式分配空间:像素=(void*)malloc(30000);
---仍然获得分段错误。不确定如何分配此错误,我尝试了几种变体。您的音高看起来不正确(应该是宽度*字节/像素+填充,我高度怀疑RGBA8是32字节/像素-应该是4),30000太少了-您请求了整个纹理,所以您至少需要pitch*height
字节(例如,在我心不在焉的计算中为2592000)。正如对malloc()调用的评论一样
:您不需要强制转换。即使在分配时,比如说int*
您也不需要强制转换,但是malloc()<代码> >返回代码>空白>代码>,所以根本不需要进行。也许这里不相关,但要记住的东西。C++认为,你必须使用Casic,但是他们说无论如何你都应该在C++中使用<代码>新< /代码>。