繁体   English   中英

如何使用 SDL2 在 C 中分离 window 创建和绘制 function?

[英]How do I separate window creation and a draw function in C using SDL2?

我正在尝试将绘图(drawing.c)与 window 和渲染器(initialize.c)的创建分开。 我希望它们都在不同的源文件中。 绘图代码运行并执行,但图形没有更新。

如果我将绘图文件中的代码放在创建 window 和渲染文件中,它就可以工作。 window 中的颜色现在为红色。

main.c - 主文件

SDL_Window *window;
SDL_Renderer *renderer;

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

    SDL_Dealy(5000);
    SDL_Quit();
}

initialize.c - 创建 window 和渲染器

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 - 将图形绘制到 window

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

当我运行代码时,window 显示为黑色。 它应该充满红色。 运行代码时,我没有收到任何错误消息。 新的彩色图形永远不可见。

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

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的值。 然后它将新的窗口/渲染器分配给它的局部变量,当 function 返回时它会丢失 - 在此之后没有修改全局变量。 然后你调用draw(renderer); 使用相同的全局未分配renderer (NULL) - 绝不会像您期望的那样工作。

基本上 function 不能修改作为其 arguments 传递的任何内容,因为它获取传递值的副本。 正确的版本如下所示:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM