如何在MacOS上使用SDL2创建窗口

4

我正在尝试使用SDL2创建一个窗口。编译时没有错误,但是运行时也没有出现任何窗口。

这是我的代码(为了易读性,省略了错误检查)。

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

int main(void)
{
    SDL_Window      *win = NULL;
    SDL_Renderer    *ren = NULL;

    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_CreateWindowAndRenderer(320, 640, 0, &win, &ren);

    SDL_SetRenderDrawColor(ren, 0, 0, 0, 255);
    SDL_RenderClear(ren);
    SDL_RenderPresent(ren);

    SDL_Delay(3000);

    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();

    return (0);
}

我还尝试过从维基上这个代码示例,但问题依旧。

编译

clang -F /Library/Frameworks -framework SDL2 main.c

我在MacOS Big Sur上工作。我从官网下载的.dmg文件(运行时二进制文件/Mac OS X)中安装了SDL2,并将其放置在/ Library / Frameworks文件夹中。

这是否是兼容性问题?我该如何解决?

编辑

我还尝试按照这个教程安装SDL,但问题依旧。


你的代码对我有效 - 生成了一个黑色窗口,持续3秒。 - KamilCuk
这就是为什么我认为SDL2的这个版本和macOS Big Sur存在兼容性问题,我无法获得任何窗口,我尝试了几种不同的代码... - lfalkau
4
添加SDL_PollEvent和事件循环。无论如何您都需要它来处理输入,而且我听说在某些平台上否则窗口可能不会显示出来。 - HolyBlackCat
1个回答

4
你需要添加一个事件循环来获取窗口 -
#include <stdlib.h>
#include <SDL2/SDL.h>

int main(void)
{
    SDL_Window      *win = NULL;
    SDL_Renderer    *ren = NULL;

    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_CreateWindowAndRenderer(320, 640, 0, &win, &ren);

    SDL_SetRenderDrawColor(ren, 0, 0, 0, 255);
    SDL_RenderClear(ren);
    SDL_RenderPresent(ren);
    bool quit = false;

            //Event handler
            SDL_Event e;

            //While application is running
            while( !quit )
            {
                //Handle events on queue
                while( SDL_PollEvent( &e ) != 0 ) // poll for event
                {
                    //User requests quit
                    if( e.type == SDL_QUIT ) // unless player manually quits
                    {
                        quit = true;
                    }
                }
            }

    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();

    return (0);
}

你确定吗?我今天下午一定会尝试,但不是应该即使没有事件循环也打印窗口吗?文档说它必须能够在没有事件循环的情况下工作。 - lfalkau
是的,我确定。我们需要一个核心游戏循环,否则窗口会在3秒延迟后被销毁。 - Shilpi Roy
但这正是我想要的,我不希望窗口在那3秒后保持打开状态,我只是希望它至少出现一次。 - lfalkau
无论如何,我尝试了一下,你是对的,虽然我不明白为什么,但它确实有效。 - lfalkau
1
我猜这是一个平台特定的问题。你的代码在Windows上可以运行,在Mac OS上你需要有一个游戏循环。如果你想让它在3秒延迟后关闭,你可以在外部while循环中的SDL_Delay(3000)之后添加一个break。 - Shilpi Roy
1
您可以参考 https://dev59.com/tVsW5IYBdhLWcg3w8q5S 获取更多信息。 - Shilpi Roy

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