【问题标题】:SDL not rendering pixelsSDL 不渲染像素
【发布时间】:2016-10-28 09:18:24
【问题描述】:

我正在尝试通过像素级访问更改 SDL 中窗口的背景颜色(我正在制作粒子爆炸),但背景保持白色。

首先我尝试使用 memset 将像素的内存设置为 0x00 以将颜色更改为黑色(我使用 memset 是因为我正在学习使用它的教程)

memset(buffer, 0x00, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(Uint32));

由于这不起作用,我查找了如何更改渲染器的绘制颜色并想出了:

SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 255);

这是我的纹理、渲染器和缓冲区代码,以及我如何设置窗口(SCREEN_WIDTH 和 SCREEN_HEIGHT 是分别设置为 800 和 600 的常量整数):

SDL_Window* window = SDL_CreateWindow("Fire Particle Explosion", 
    SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
    SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STATIC, SCREEN_WIDTH, SCREEN_HEIGHT);
Uint32* buffer = new Uint32[SCREEN_WIDTH * SCREEN_HEIGHT];

SDL_UpdateTexture(texture, NULL, buffer, SCREEN_WIDTH * sizeof(Uint32));
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);

如何正确地逐像素更改背景,为什么我尝试的两种方式都不起作用?

【问题讨论】:

    标签: c++ sdl pixels


    【解决方案1】:

    您不需要操作内存中的缓冲区来实现这一点,而且您可能不需要纹理。推荐的方法是使用 SDL2 中的“2D 加速渲染”功能。

    首先,不要使用“SDL_RENDERER_PRESENTVSYNC”参数,而是使用“0”。在 Linux 上,一些旧的图形驱动程序会产生带有该标志的闪烁。

    这应该将屏幕擦除为黑色:

    SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 255);
    SDL_RenderClear(renderer);
    

    我强烈建议您使用SDL_RenderDrawPoint() 来逐像素更新屏幕。它是硬件加速的。

    基本上,您的游戏循环中会发生以下情况:

    - set the color to black, then erase the screen with SDL_RenderClear()
    - for each point to draw, first set the draw color, then draw the point
    - use SDL_RenderPresent()
    

    我用 C 语言编写了一个用于制作粒子爆炸的 SDL2 代码小示例:drawpoints

    【讨论】:

    • 即使注释掉所有缓冲区和纹理代码,并将“SDL_RENDERER_PRESENTVSYNC”切换为“0”,SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 255); SDL_RenderClear(renderer); 也不会将背景颜色更改为黑色。我试图查看您的示例,但我是 C++ 新手,并且不了解您使用的许多东西(例如 #define 而不是 static const、kbs、typedef struct 等)。知道为什么它没有用这两行渲染屏幕(仍然没有错误或警告)
    • 我认为你的速度太快了。在进入 SDL 编程之前,您应该先学习 C 编程。准备好后,请在 lazyfoo.net/tutorials/SDL 上完成教程。
    • 我想学C++而不是C,我觉得如果我先学C,以后会混淆这两者。我知道少量的 C++(参见udemy.com/free-learn-c-tutorial-beginners,我在粒子效果教程中)。最后,我无意使用 SDL,它只是作为一种媒介来教授如何使用本教程其余部分中学到的知识来创建整个项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2019-07-08
    • 1970-01-01
    相关资源
    最近更新 更多