Не могу понять, почему строка не рисуется в SDL

#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() .