如何在SDL2.0中使用像素绘制?
我正在尝试熟悉C ++,但如果没有漂亮的图片,这很难做到,所以我试图让一个非常基本的图形显示器运行。我真正想做的就是给我一个窗口,让我在其上绘制rgbα像素,并访问有关这些像素的信息。我可能还有其他我不想要的东西,但这就是我现在所有的东西。我对此的研究使我尝试使用SDL,当前版本为2.0。
几乎所有的图形体验都来自于在<canvas>
上使用JavaScript。大多数其他位来自我的计算器,它具有非常棒的Pxl-On()
命令,非常简单。
我正在使用MinGW作为我的C ++,如果重要的话。此外,如果有更好的东西比SDL2.0更适合我需要的东西,建议欢迎。
**“更好”意味着“包含我需要的功能,但总功能少于SDL2.0,和/或具有比SDL2.0更直观/更简单的*** API。”
***减少完成相同任务的代码行。
我不知道你的代码是如何构建的。假设你有一个SDL_Window和一个SDL_Renderer,你只需要调用SDL_RenderDrawPoint(renderer, x, y)
。
如果您没有渲染器或窗口,则可以使用SDL_CreateWindowAndRenderer()创建两者。例如:
SDL_Window *window;
SDL_Renderer *renderer;
SDL_CreateWindowAndRenderer(800, 600, 0, &window, &renderer);
//Probably on a loop
SDL_RenderDrawPoint(renderer, 400, 300); //Renders on middle of screen.
SDL_RenderPresent(renderer);
这应该在屏幕中间绘制一个像素。读取像素有点复杂。您可以使用SDL_RenderReadPixels()
,它是为读取区域而制作的,但您可以指定1x1的区域。如果你真的需要,请阅读wiki page。
如果您在使用SDL2时遇到很多麻烦,建议您阅读Lazy Foo tutorials。 SDL2部分仍在进行中,但有足够的材料可以开始学习。
可运行的例子
使用SDL_RenderDrawPoint
在屏幕上逐个像素地绘制对角红线。
main.c中
#include <stdlib.h>
#include <SDL2/SDL.h>
#define WINDOW_WIDTH 600
int main(void) {
SDL_Event event;
SDL_Renderer *renderer;
SDL_Window *window;
int i;
SDL_Init(SDL_INIT_VIDEO);
SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_WIDTH, 0, &window, &renderer);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
for (i = 0; i < WINDOW_WIDTH; ++i)
SDL_RenderDrawPoint(renderer, i, i);
SDL_RenderPresent(renderer);
while (1) {
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
break;
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return EXIT_SUCCESS;
}
编译并运行:
gcc -std=c89 -Wextra -pedantic-errors -o main.out main.c -lSDL2
./main.out
如果你想一次设置一个大的像素矩形,例如整个屏幕或精灵,使用SDL_Texture
+ SDL_RenderCopy
和可能的SDL_TEXTUREACCESS_STREAMING
,因为这将更快。示例:
在libsdl 2.0.2,Ubuntu 15.10上测试过。
我发现Python + PySDL2更容易原型化。调试也很有趣,因为对于像素图形来说它是一个很好的标准。 =)这是完整的代码:
"""
The code is placed into public domain
by anatoly techtonik <[email protected]>
"""
import sdl2
import sdl2.ext
sdl2.ext.init()
window = sdl2.ext.Window('', size=(300, 100))
window.show()
renderer = sdl2.ext.Renderer(window)
renderer.draw_point([10,10], sdl2.ext.Color(255,255,255))
renderer.present()
running = True
while running:
for e in sdl2.ext.get_events():
if e.type == sdl2.SDL_QUIT:
running = False
break
if e.type == sdl2.SDL_KEYDOWN:
if e.key.keysym.sym == sdl2.SDLK_ESCAPE:
running = False
break