#c #sdl
#c #sdl
Вопрос:
Эта программа для рисования строки в SDL не работает:
#include "SDL.h"
int main(int argc, char** argv)
{
SDL_Window* window = SDL_CreateWindow("A line", 10, 10, 1200, 600, false);
bool running = true;
while (running)
{
SDL_Event events;
if (SDL_WaitEvent(amp;events))
if (events.type == SDL_QUIT)
running = false;
SDL_Renderer* renderer;
renderer = SDL_CreateRenderer(window, -1, 0);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
SDL_RenderDrawLine(renderer, 10, 10, 500, 500);
}
SDL_Quit();
return 1;
}
Когда я запускаю программу, я не получаю никаких ошибок, но и ничего не отображается.
Комментарии:
1. Вы не должны создавать средство визуализации для каждого кадра.
2. Или утечка указанного средства визуализации.
3. Я просто изменил код, чтобы создать средство визуализации только один раз и запустить его, но он по-прежнему ничего не рисует.
Ответ №1:
Несколько проблем:
- Вам не хватает a
SDL_RenderPresent()
, поэтому на самом деле ничего не выводится на экран. - Как указывает @tkausl, не создавайте (и не просачивайте) SDL_Renderer в каждом кадре
- Используйте
SDL_PollEvent()
в цикле, чтобы полностью разрядить очередь событий. SDL_SetRenderDrawColor()
влияетSDL_RenderClear()
так же хорошо, какSDL_RenderDrawLine()
и; как можно себе представить, черное на черном довольно сложно увидеть 🙂 Установите более заметный цвет, прежде чем пытаться нарисовать линию.- Вероятно, следует передать
a = 255
SDL_SetRenderDrawColor()
.
Все вместе:
// g main.cpp `pkg-config --cflags --libs sdl2`
#include "SDL.h"
int main(int argc, char** argv)
{
SDL_Window* window = SDL_CreateWindow("A line", 10, 10, 1200, 600, false);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
bool running = true;
while (running)
{
SDL_Event event;
while( SDL_PollEvent(amp;event) )
{
if (event.type == SDL_QUIT)
running = false;
}
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderDrawLine(renderer, 10, 10, 500, 500);
SDL_RenderPresent( renderer );
}
SDL_Quit();
return 1;
}
Комментарии:
1. Также есть еще один вопрос: достаточно ли вызвать
SDL_RenderPresent( renderer );
один раз? или я должен вызывать это каждый раз, когда я что-то рисую?2. @Cool_Cornflakes: обычно вам нужно вызывать только
SDL_RenderPresent()
один раз за кадр.3. Большое спасибо, теперь он работает. Еще один вопрос: я читал, что ожидание событий происходит быстрее, чем опрос, так зачем использовать опрос?
4.
SDL_WaitEvent()
блокирует вызывающий процесс, если очередь событий пуста, что является проблемой, если у вас есть логика игрового типа, которая должна выполняться непрерывно.SDL_PollEvent()
это быстрый и простой обходной путь, хотя вы можете зарегистрировать обратный вызов таймера, который отправляет пользовательское событие , если вы настроены решительноSDL_WaitEvent()
.