gpt4 book ai didi

c++ - SDL 不渲染像素

转载 作者:行者123 更新时间:2023-11-30 05:26:00 24 4
gpt4 key购买 nike

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

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

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

因为那行不通,我查阅了如何更改渲染器的绘制颜色并想出了:

SDL_SetRenderDrawColor(渲染器, 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);

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

最佳答案

您不需要操纵内存中的缓冲区来实现这一点,您可能也不需要纹理。推荐的方法是使用 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

关于c++ - SDL 不渲染像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38035666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com