Как нарисовать пиксели в SDL 2.0?

Как рисовать с пикселями в SDL2.0?

Я пытаюсь познакомиться с C++, но это очень трудно сделать без красивых картинок, поэтому я пытаюсь запустить очень простой графический дисплей. Все, чего я действительно хочу, это дать мне окно, позвольте мне нарисовать на нем пиксели rgbα и получить доступ к информации об этих пикселях. Могут быть и другие вещи, о которых я не знаю, но это все, что сейчас в моем списке. Мои исследования привели меня к попытке использовать SDL, текущая версия 2.0.

Практически весь мой графический опыт связан с использованием JavaScript на <canvas>, Большая часть остальной части исходит от моего калькулятора, который имеет это действительно круто Pxl-On() команда, так просто.

Я использую MinGW для моего C++, если это имеет значение. Кроме того, если есть что-то лучшее **, чем SDL2.0 для того, что мне нужно, совет приветствуется.


** "лучше" означает "содержит те функции, которые мне нужны, но меньше общей функциональности, чем SDL2.0, и / или имеет более интуитивный / менее сложный *** API, чем SDL2.0".

*** Меньше строк кода для выполнения той же задачи.

3 ответа

Решение

Я не знаю, как ваш код структурирован. Предполагая, что у вас есть 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. Прочитайте вики-страницу, если она вам действительно нужна.

Если у вас возникли большие проблемы с SDL2, рекомендуем прочитать учебные пособия Lazy Foo. Раздел SDL2 все еще находится в стадии разработки, но материала для начала достаточно.

Runnable пример

Рисует диагональную красную линию попиксельно на экране, используя 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;
}

Компилировать с:

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, так как это будет намного быстрее. Примеры на:

Я считаю, что 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
Другие вопросы по тегам