[英]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);
,它获取全局window
和renderer
的值。 然后它将新的窗口/渲染器分配给它的局部变量,当 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.