gpt4 book ai didi

c++ - SDL 窗口不显示

转载 作者:可可西里 更新时间:2023-11-01 16:59:15 47 4
gpt4 key购买 nike

这是我的代码:

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

int main(int argc, const char * argv[]) {

SDL_Init(SDL_INIT_VIDEO);

SDL_Window *_window;
_window = SDL_CreateWindow("Game Engine", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 700, 500, SDL_WINDOW_RESIZABLE);

SDL_Delay(20000);

SDL_DestroyWindow(_window);
SDL_Quit();

return 0;

}

我在 Xcode 中工作。我已经下载了 SDL2 并将库导入到项目构建阶段。我已经测试过 SDL2 可以正常工作。

问题是窗口永远不会出现。我只是得到一个“spinning-mac-wheel”,然后程序在延迟后退出。我已确定窗口没有隐藏在某处。

想法?

最佳答案

你必须给系统一个机会让它的事件循环运行。

最简单的是自己轮询事件:

SDL_Event e;
bool quit = false;
while (!quit){
while (SDL_PollEvent(&e)){
if (e.type == SDL_QUIT){
quit = true;
}
if (e.type == SDL_KEYDOWN){
quit = true;
}
if (e.type == SDL_MOUSEBUTTONDOWN){
quit = true;
}
}
}

代替等待循环

--- 附录

因为这个答案仍在帮助人们,如果我还添加更多关于为什么它有效的信息而不是仅仅发布解决方案,也许会更好。

当在 Mac 上(实际上 Windows 也是如此)程序启动时,它仅从“主线程”开始。这是用于设置 UI 内容的线程。 “main thead”与其他线程的不同之处在于它带有一个事件处理系统。该系统捕获鼠标移动、按键、按钮点击等事件,然后将这些事件排队并让您的代码对其做出响应。 Mac(和 Windows)上的所有 UI 事物都依赖于此事件泵的存在和运行。这就是为什么如果你在代码中做任何与 UI 相关的事情,你需要确保你不在不同的线程上。

现在,在您的代码中初始化窗口和 UI,然后执行 SDL_Delay。这只会阻塞线程并将其暂停 20 秒,所以什么都不做。并且由于您在主线程上执行此操作,因此甚至会阻塞事件队列的处理。所以在 Mac 上显示为旋转的 macwheel。

所以我发布的解决方案实际上一直在轮询事件并处理它们。通过这种方式,您实际上也是在“空闲”,但是一旦发布事件(例如鼠标点击和按键),线程将再次唤醒并处理内容。

关于c++ - SDL 窗口不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34424816/

47 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com