Ubuntu 中的 C 和 SDL 未按预期工作

C and SDL in Ubuntu not working as intended

我正在关注 Youtube 上的一个教程,但是当我尝试时它没有按预期工作。

代码如下:

#include <stdio.h>
#include <SDL2/SDL.h>

void start(SDL_Window* window, SDL_Renderer* renderer)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    window = SDL_CreateWindow("Hello", 200, 200, 200, 200, 0);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

    SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
    SDL_RenderClear(renderer);
    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

    SDL_Rect rect = {220, 140, 200, 200};
    SDL_RenderFillRect(renderer, &rect);
}

void stop(SDL_Window* window, SDL_Renderer* renderer)
{
    SDL_DestroyWindow(window);
    SDL_DestroyRenderer(renderer);
}

int main(int argc, char **argv)
{
    SDL_Window* window;
    SDL_Renderer* renderer;

    start(window, renderer);
    SDL_Delay(5000);
    stop(window, renderer);

    return 0;
}

应该在 window 的中间创建一个白色矩形并用蓝色填充其余部分,但是当我 运行 它时不会发生这种情况。相反,它 "captures a picture" 它下面的程序,例如背景。为什么会这样,我该如何解决?

您有两个问题需要解决。首先,您需要修改您的 start() 函数以获取指向指针的指针,而不仅仅是指针,以便可以修改 main() 中的 windowrenderer 变量... 否则,start() 中的 windowrenderer 将有效,但 main() 中相应的指针变量将不会更改并保持未初始化状态。所以...

/* Use 'SDL_Window**' and 'SDL_Renderer**' instead of 'SDL_Window*' and
 *  'SDL_Renderer*', and dereference once during use (eg. '*window' 
 *  instead of 'window' */
void start(SDL_Window** window, SDL_Renderer** renderer)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    *window = SDL_CreateWindow("Hello", 200, 200, 200, 200, 0);
    *renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED);

    SDL_SetRenderDrawColor(*renderer, 0, 0, 255, 255);
    SDL_RenderClear(*renderer);
    SDL_SetRenderDrawColor(*renderer, 255, 255, 255, 255);

    SDL_Rect rect = {220, 140, 200, 200};
    SDL_RenderFillRect(*renderer, &rect);
}

然后在main()中使用:

    start(&window, &renderer); /* pass addresses, not values */

第二个问题是您需要在完成绘图操作后更新屏幕。您可以在 SDL_RenderPresent() 时执行此操作 完成绘图,例如在调用 start() 函数后立即在 main() 中:

...
    start(&window, &renderer);
    SDL_RenderPresent(renderer); /* add this */
    SDL_Delay(5000);
...

您可能还想更改 SDL_Rect 中的值,这样它就不会绘制在 window 之外。