25

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

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

我几乎所有的图形体验都来自于在<canvas>. 其他大部分来自我的计算器,它有这个非常棒Pxl-On()命令,非常简单。

如果重要的话,我将 MinGW 用于我的 C++。此外,如果我需要的东西比 SDL2.0 更好**,欢迎提出建议。


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

*** 更少的代码行来完成相同的任务。

4

3 回答 3

27

可运行示例

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

在此处输入图像描述

主程序

#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 上游.

编译并运行:

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 上测试。

于 2016-03-14T13:55:48.767 回答
22

我不知道你的代码是如何构成的。假设你有一个 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 页面。

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

于 2013-12-18T02:53:16.440 回答
3

我发现 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
于 2014-01-11T14:20:10.223 回答