如何在SDL2.0中使用像素绘制?
我正在尝试熟悉C ++,但如果没有漂亮的图片,这很难做到,所以我试图让一个非常基本的图形显示器运行。我真正想做的就是给我一个窗口,让我在其上绘制rgbα像素,并访问有关这些像素的信息。我可能还有其他我不想要的东西,但现在就在我的名单上。我对此的研究使我尝试使用SDL,当前版本为2.0。
我的几乎所有图形体验都来自<canvas>
上使用JavaScript。大多数其他位来自我的计算器,它具有真正令人敬畏的Pxl-On()
命令,非常简单。
如果重要的话,我正在使用MinGW作为我的C ++。此外,如果有更好的东西比SDL2.0更适合我的需要,建议欢迎。
**“更好”意味着“包含我需要的功能,但总功能少于SDL2.0,和/或具有比SDL2.0更直观/更简单的*** API。”
***完成相同任务的代码行数较少。
答案 0 :(得分:9)
我不知道您的代码是如何构建的。假设你有一个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部分仍在进行中,但有足够的材料可以开始学习。
答案 1 :(得分:9)
可运行的示例
使用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上测试。
答案 2 :(得分:1)
我发现Python + PySDL2更容易原型化。调试也很有趣,因为对于像素图形来说它是一个很好的标准。 =)这是完整的代码:
"""
The code is placed into public domain
by anatoly techtonik <techtonik@gmail.com>
"""
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