窗口未显示SDL2

5

我第一次使用SDL2时,试图创建一个窗口,但窗口未显示出来,只有一个图标在我的dock中出现 (图标的图片,`SDLTest.out`是我的可执行文件的名称)。我发现它是在调用SDL_INIT()时出现的。

我尝试过更新视窗、更改颜色以及添加标志 SDL_WINDOW_SHOWN,但这些解决方案都没有起作用。我甚至从互联网上复制了一段代码,但也没有帮助。

以下是我复制的代码:

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


int main(int argc, char *argv[])
{
    SDL_Window *window = NULL;
    SDL_Renderer *renderer = NULL;
    int status = EXIT_FAILURE;
    SDL_Color orange = {255, 127, 40, 255};
    
    if(0 != SDL_Init(SDL_INIT_VIDEO))
    {
        fprintf(stderr, "Error SDL_Init : %s", SDL_GetError());
        goto Quit;
    }
    window = SDL_CreateWindow("SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                              640, 480, SDL_WINDOW_SHOWN);
    if(NULL == window)
    {
        fprintf(stderr, "Error SDL_CreateWindow : %s", SDL_GetError());
        goto Quit;
    }
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if(NULL == renderer)
    {
        fprintf(stderr, "Error SDL_CreateRenderer : %s", SDL_GetError());
        goto Quit;
    }
    
    if(0 != SDL_SetRenderDrawColor(renderer, orange.r, orange.g, orange.b, orange.a))
    {
        fprintf(stderr, "Error SDL_SetRenderDrawColor : %s", SDL_GetError());
        goto Quit;
    }
    
    if(0 != SDL_RenderClear(renderer))
    {
        fprintf(stderr, "Error SDL_SetRenderDrawColor : %s", SDL_GetError());
        goto Quit;
    }
    
    SDL_Delay(500);
    SDL_RenderPresent(renderer);
    SDL_Delay(500);
    
    status = EXIT_SUCCESS;

Quit:
    if(NULL != renderer)
        SDL_DestroyRenderer(renderer);
    if(NULL != window)
        SDL_DestroyWindow(window);
    SDL_Quit();
    return status;
}

我的操作系统是MacOS 11.6,我的编译器是GCC,我的电脑有一个英特尔Iris Pro Graphics 6200显卡,并且我使用Homebrew安装了SDL2。

有人可以帮我吗?


1
我在我的Linux上测试了您的代码,它运行正常:一个空窗口被显示出来,然后变成橙色,最后关闭。 - rodrigo
这是它应该做的事情,但在我的电脑上无法工作 ;( - Hobbes
3
你需要一个事件循环。在某些平台上,如果没有它,东西就无法正常工作。继续阅读你的教程,它应该会有相关介绍。 - HolyBlackCat
它正常工作了,非常感谢您的答案! - Hobbes
1个回答

6

我只需要一个事件循环。我添加了这段代码,它就可以工作了:

    SDL_bool quit = SDL_FALSE;
    while(!quit)
    {
        SDL_RenderPresent(renderer);
        SDL_WaitEvent(&event);
        if(event.type == SDL_QUIT)
            quit = SDL_TRUE;
    }

感谢 HolyBlackCat 的评论!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接