如何使用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,640,480,0);
    renderer = SDL_CreateRenderer(window,-1,0);
}

draw.c-将图形绘制到窗口

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

运行代码时,窗口显示为黑色。应该以红色填充。运行代码时,我没有收到任何错误消息。新的彩色图形永远不会显示。

ezeke123 回答:如何使用SDL2在C语言中分开窗口创建和绘图功能?

除非实际代码与所讨论的代码不同,否则我看不到它如何在单个文件中工作。查看您的初始化函数:

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

当您从main调用为initialize(window,renderer);时,它将获取全局windowrenderer的值。然后,它将新的窗口/渲染器分配给其局部变量,该局部变量在函数返回时丢失-此后不再修改全局变量。然后,您使用相同的全局未分配​​的draw(renderer);(NULL)调用renderer-无法正常运行。

基本上,函数无法修改作为参数传递的任何内容,因为它会获取传递值的副本。正确的版本如下所示:

void initialize(SDL_Window **window,SDL_Renderer **renderer)
{
    SDL_Init(SDL_INIT_WINDOW);
    *window = SDL_CreateWindow("Title",0);
    *renderer = SDL_CreateRenderer(window,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的运行方式相同。

另一件事是您不能期望绘制和延迟能够正确显示。它可能适用于您的OS /窗口管理器/设置/运气的配置,但不适用于其他配置。刷新循环至关重要。

本文链接:https://www.f2er.com/3131366.html

大家都在问