Как нарисовать пиксели в 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