如何在SDL 2.0中绘制像素?

Jor*_*dan 12 c c++ sdl sdl-2

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

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

几乎所有的图形体验都来自于使用JavaScript <canvas>.大多数其他位的是来自我的计算器,它有这个真的真棒Pxl-On()命令,那么容易.

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


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

***减少完成相同任务的代码行.

小智 12

我不知道你的代码是如何构建的.假设你有一个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);
Run Code Online (Sandbox Code Playgroud)

这应该在屏幕中间绘制一个像素.读取像素有点复杂.你可以使用SDL_RenderReadPixels(),它是为了读取一个区域,但是你可以指定一个1x1的区域.如果您真的需要,请阅读维基页面.

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


Cir*_*四事件 11

可运行的例子

使用在屏幕上逐个像素地绘制对角红线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;
}
Run Code Online (Sandbox Code Playgroud)

编译:

gcc -std=c89 -Wextra -pedantic-errors -o main.out main.c -lSDL2
./main.out
Run Code Online (Sandbox Code Playgroud)

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

如果你想一次设置一个大的矩形像素,例如整个屏幕或一个精灵,使用SDL_Texture+ SDL_RenderCopy和可能SDL_TEXTUREACCESS_STREAMING,因为它会更快.示例: