如何使用SDL2在C中分离窗口创建和绘制函数



我正试图将屏幕上的图形(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);
}

当我运行代码时,窗口显示为黑色。它应该用红色填充。当我运行代码时,我没有收到错误消息。新的彩色图形永远不会呈现为可见。

我看不出它是如何在单个文件中工作的,除非实际的代码与所讨论的不同。看看你的初始化功能:

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);时,它将获得全局windowrenderer的值。然后,它将新的窗口/渲染器分配给它的局部变量,当函数返回时,局部变量会丢失——之后不会修改全局变量。然后用相同的全局未分配的renderer(NULL(调用draw(renderer);——它不可能像您预期的那样工作。

基本上,函数不能修改作为其参数传递的任何内容,因为它获得了传递值的副本。正确的版本如下:

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的操作方式相同。

另一件事是,你不能期望绘制和延迟被正确显示;它可能适用于您的操作系统/窗口管理器/设置/运气配置,但不适用于其他配置。刷新循环是必不可少的。

最新更新