如何在SDL 2.0中绘制像素?

如何在SDL2.0中使用像素绘制?

我正在尝试熟悉C ++,但如果没有漂亮的图片,这很难做到,所以我试图让一个非常基本的图形显示器运行。 我真正想做的就是给我一个窗口,让我在其上绘制rgbα像素,并访问有关这些像素的信息。 可能还有其他我想要的东西,我不知道,但这就是我现在所有的东西。 我对此的研究使我尝试使用SDL,当前版本为2.0。

几乎所有的图形体验都来自在上使用JavaScript。 大多数其他位来自我的计算器,它具有非常棒的Pxl-On()命令,非常简单。

我正在使用MinGW作为我的C ++,如果重要的话。 此外,如果有什么比SDL2.0更好的我需要的东西,建议欢迎。


**“更好”意味着“包含我需要的function,但总function少于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() ,它用于读取区域,但您可以指定1×1的区域。 如果您真的需要,请阅读维基页面 。

如果您在使用SDL2时遇到很多麻烦,建议您阅读Lazy Foo教程 。 SDL2部分仍在进行中,但有足够的材料可以开始学习。

可运行的例子

使用SDL_RenderDrawPoint在屏幕上逐个像素地绘制对角红线。

在此处输入图像描述

 #include  #include  #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 

在libsdl 2.0.2,Ubuntu 15.10上测试过。 GitHub上游 。

如果要一次设置一个大矩形像素,例如整个屏幕或精灵,请使用SDL_Texture + SDL_RenderCopy和可能的SDL_TEXTUREACCESS_STREAMING ,因为这样会快得多。 示例:

  • 什么是SDL中的Blit?
  • 从SDL 1.2中的RGB值数组渲染像素?

我发现Python + PySDL2更容易原型化。 调试也很有趣,因为对于像素图形来说它是一个很好的标准。 =)这是完整的代码:

 """ The code is placed into public domain by anatoly techtonik  """ 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