[英]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.