Я не вижу, как это могло бы работать в одном файле, если фактический код не отличается от представленного в вопросе. Посмотрите на вашу функцию инициализации:
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 .
Другое дело, что вы не можете ожидать рисования изадержка для корректного отображения;это может работать на вашей конфигурации ОС / оконного менеджера / настроек / удачи, но не других. Цикл обновления необходим.