【问题标题】:How to create a window with SDL2 on MacOS如何在 MacOS 上使用 SDL2 创建窗口
【发布时间】:2021-03-17 11:24:20
【问题描述】:

我正在尝试使用 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);
}

我还尝试了来自 wiki 的 this 代码示例,同样的问题。

编译

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

我正在开发 MacOS Big Sur。我从their website(运行时二进制文件/Mac OS X)上下载的.dmg 文件安装了SDL2,并放入/Library/Frameworks 文件夹

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

编辑

我也尝试在this tutorial 之后安装 SDL,仍然是同样的问题。

【问题讨论】:

  • 您的代码对我有用 - 生成了 3 秒的黑色窗口。
  • 这就是为什么我认为这个版本的 SDL2 和 macOS BigSur 存在兼容性问题,我没有看到任何窗口,我尝试了几个不同的代码......
  • 添加SDL_PollEvent 和一个事件循环。无论如何,您都需要它来处理输入,而且我听说在某些平台上,窗口不会以其他方式显示。

标签: c sdl sdl-2


【解决方案1】:

你需要添加一个事件循环来获取窗口-

#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);
}

【讨论】:

  • 你确定吗?我今天下午肯定会尝试,但是即使没有事件循环,它也不应该打印窗口吗?文档说它必须在没有的情况下工作。
  • 是的,我确定。我们需要有一个核心游戏循环,否则窗口会在 3 秒延迟后被破坏。
  • 但这就是我真正想要的,我不希望窗口在这 3 秒后保持打开状态,我只希望它至少出现一次
  • 我猜这是一个特定于平台的问题。您的代码适用于 windows,在 mac os 上您需要有一个游戏循环。如果您希望它在延迟 3 秒后关闭,您可以在外部 while 循环中的 SDL_Delay(3000) 之后添加一个中断。
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2015-05-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多