Как разделить создание окна и функцию рисования в C с использованием SDL2? - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь отделить рисунок (drawing.c) на экране от создания окна и средства визуализации (initialize.c). Я хочу их обоих в разных исходных файлах. Код чертежа выполняется и выполняется, но графика не обновляется.

Если я поместил код из файла чертежа в окно создания и файл рендеринга, он работает. Цвет в окне теперь красный.

main.c - Основной файл

SDL_Window *window;
SDL_Renderer *renderer;

int main()
{
    initialize(window, renderer);
    draw(renderer);

    SDL_Dealy(5000);
    SDL_Quit();
}

initialize.c - Создать окно и визуализатор

void initialize(SDL_Window *window, SDL_Renderer *renderer)
{
    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow("Title", 
        SDL_WINDOWPOS_UNDEFINED, 
        SDL_WINDOWPOS_UNDEFINED, 
        640, 480, 0);
    renderer = SDL_CreateRenderer(window, -1, 0);
}

draw. c - Рисование графики в окне

void draw(SDL_Renderer *renderer)
{
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
}

Когда я запускаю код, окно отображается черным. Он должен быть заполнен красным. Я не получаю сообщений об ошибках при запуске кода. Новая цветная графика никогда не отображается.

1 Ответ

1 голос
/ 10 ноября 2019

Я не вижу, как это могло бы работать в одном файле, если фактический код не отличается от представленного в вопросе. Посмотрите на вашу функцию инициализации:

void initialize(SDL_Window *window, SDL_Renderer *renderer)
{
    SDL_Init(SDL_INIT_VIDEO);
    window = SDL_CreateWindow("Title", 
        SDL_WINDOWPOS_UNDEFINED, 
        SDL_WINDOWPOS_UNDEFINED, 
        640, 480, 0);
    renderer = SDL_CreateRenderer(window, -1, 0);
}

Когда вы вызываете ее из main как initialize(window, renderer);, она получает значения глобальных window и renderer. Затем он назначает новое окно / средство визуализации своим локальным переменным, которое теряется при возврате функции - после этого глобальная переменная не изменяется. Затем вы вызываете draw(renderer); с тем же глобальным неназначенным renderer (NULL) - никоим образом это не будет работать так, как вы ожидаете.

В основном функция не может изменить что-либо, переданное в качестве аргументов, потому что она получает копиюпройденных значений. Правильная версия будет выглядеть следующим образом:

void initialize(SDL_Window **window, SDL_Renderer **renderer)
{
    SDL_Init(SDL_INIT_WINDOW);
    *window = SDL_CreateWindow("Title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
    *renderer = SDL_CreateRenderer(window, -1, 0);
}

// ...
// in file with main func
SDL_Window *window;
SDL_Renderer *renderer;
void initialize(SDL_Window **window, SDL_Renderer **renderer);
void draw(SDL_Renderer *renderer);

int main()
{
    // ...
    initialize(&window, &renderer);
    draw(renderer);
    // ...
}

Это то же самое, что и SDL_CreateWindowAndRenderer .

Другое дело, что вы не можете ожидать рисования изадержка для корректного отображения;это может работать на вашей конфигурации ОС / оконного менеджера / настроек / удачи, но не других. Цикл обновления необходим.

...