如何在SDL 2.0中绘制像素?

时间:2013-12-14 04:25:13

标签: c++ c sdl sdl-2

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

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

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

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


**“更好”意味着“包含我需要的功能,但总功能少于SDL2.0,和/或具有比SDL2.0更直观/更简单的*** API。”

***完成相同任务的代码行数较少。

3 个答案:

答案 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在屏幕上逐个像素地绘制对角红线。

enter image description here

的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;
}

GitHub upstream

编译并运行:

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