我正在尝试使用像素级别访问(我正在制作粒子爆炸)来更改SDL中窗口的背景颜色,但背景却保持白色。
首先我尝试使用memset将像素的内存设置为0x00以将颜色更改为黑色(我使用了memset,因为我正在按照使用它的教程)
memset(buffer, 0x00, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(Uint32));
由于这不起作用,我查找了如何更改渲染器的绘制颜色并提出:
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 255);
这是我的Texture,Renderer和Buffer代码,以及我如何设置窗口(SCREEN_WIDTH和SCREEN_HEIGHT分别是const int设置为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);
如何逐个像素地正确更改背景,为什么我尝试的两种方式都没有?
答案 0 :(得分:1)
您不需要在内存中操作缓冲区来实现这一点,并且您可能不需要纹理。推荐的方法是使用" 2D加速渲染" SDL2中的函数。
首先,没有" 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