我正在尝试从创建窗口和渲染器(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);
时,它将获得全局window
和renderer
的值。然后,它将新的窗口/渲染器分配给其局部变量,该局部变量在函数返回时丢失-此后不再修改全局变量。然后,使用相同的全局未分配的draw(renderer);
(NULL)调用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的操作方法相同。
另一件事是您不能期望绘制和延迟能够正确显示;它可能适用于您的OS /窗口管理器/设置/运气的配置,但不适用于其他配置。刷新循环至关重要。