Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C SDL2-读取用于碰撞检测的像素_C_Sdl 2 - Fatal编程技术网

C SDL2-读取用于碰撞检测的像素

C SDL2-读取用于碰撞检测的像素,c,sdl-2,C,Sdl 2,我目前正在尝试编写一个小游戏,其中包括在迷宫中移动一个点。我没有用矩形来构建迷宫,而是决定简单地创建一个迷宫的PNG图像,并将其加载为一个曲面,我还让点在屏幕上移动 现在,我一直在努力确保圆点(更像一个小盒子)保持某种颜色,并防止它移动到墙上。我试图在运动前读取像素,看看它是黑色(墙)还是白色(空白)。我已经注意到了SDL_renderAdpixels的功能,但我似乎无法使其正常工作: int w, h, access; void* pixels;

我目前正在尝试编写一个小游戏,其中包括在迷宫中移动一个点。我没有用矩形来构建迷宫,而是决定简单地创建一个迷宫的PNG图像,并将其加载为一个曲面,我还让点在屏幕上移动

现在,我一直在努力确保圆点(更像一个小盒子)保持某种颜色,并防止它移动到墙上。我试图在运动前读取像素,看看它是黑色(墙)还是白色(空白)。我已经注意到了SDL_renderAdpixels的功能,但我似乎无法使其正常工作:

        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库中也找不到一个更简单的函数来实现这一点,而且我还没有找到解决方案

  • 是否有导致seg故障的原因
  • 在SDL2中是否有更简单、更有效的方法来实现这一点
  • 我想要一些关于我的方法的反馈。我还是个初学者。代码是C语言的


    谢谢,

    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++中使用<代码>新< /代码>。