簡體   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