【问题标题】:SDL2 window doesn't immediately close?SDL2 窗口不会立即关闭?
【发布时间】:2020-11-08 03:51:57
【问题描述】:
#include "SDL.h"
#include "SDL_image.h"
#include <iostream>

const int width = 800, height = 600;

int main(int argc, char* argv[]) 
{
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
    {
        std::cout << "SDL couldn't initialise! Error: " << SDL_GetError() << std::endl;
    }

    SDL_Window* window = SDL_CreateWindow("New Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_ALLOW_HIGHDPI);

    if (window == NULL) 
    {
        std::cout << "Window couldn't be created! Error: " << SDL_GetError() << std::endl;
        return EXIT_FAILURE;
    }

    SDL_Event windowEvent;

    while (true)
    {
        if (SDL_PollEvent(&windowEvent))
        {
            if (SDL_QUIT == windowEvent.type)
            {
                break;
            }
        }
    }

    SDL_DestroyWindow(window);
    SDL_Quit();

    return EXIT_SUCCESS;
}

那么在这个小程序中,窗口是如何保持打开状态的呢?我已经尝试过什么让它保持打开,发现它是这部分:

    while (true)
    {
        if (SDL_PollEvent(&windowEvent))
        {
            if (SDL_QUIT == windowEvent.type)
            {
                break;
            }
        }
    }

更具体地说,循环在“true”时循环。但我不明白什么是真的,也不知道它是如何循环的。有人可以解释它是如何工作的吗? 如果有人基本上逐步解释了这里的所有内容,我将不胜感激。 (例如“SDL_Window”是什么,SDL_Event 是什么等)

【问题讨论】:

  • while (true) 表示“无限循环”。或者直到break 被触发。 “我不明白什么是真的” 这是一个布尔值。例如,1 &lt; 2 是 true。或42 == 42.

标签: c++ window sdl sdl-2


【解决方案1】:

除非我读错了问题,否则这似乎是一个非常非常笼统的 C++ 语言问题和 SDL 问题。我只想在这里指出,SDL 需要对 c++ 有足够的了解,所以如果你没有信心,你可能很快就会遇到更多的障碍。

无论如何,在 c++ 中,while(expression) { ... } 循环将继续循环,而括号中的“表达式”计算为真。如果你想永远循环,你可以通过写这个来强制表达式为真:while(true) { ... }。退出这个循环的唯一方法是从循环内部调用“break”命令。一旦程序跳出循环,程序将到达主“return 0;”。并安全退出。

至于这一行:

if (SDL_PollEvent(&windowEvent))

每次运行此行时,SDL 都会检查是否有任何“事件”准备好进行处理。事件是从 SDL 或您的操作系统发送到您的应用程序的“消息”,以使您的应用程序执行某些操作。在您的代码中,您正在检查窗口事件的“IE 轮询”。需要明确的是,当用户(您)单击窗口关闭按钮、最小化、最大化、调整窗口大小等时,这些事件将被发送到您的应用程序。当收到其中一条消息时,此行将返回 true。弄清楚事件是什么以及你想用它做什么是你的工作。

这些行:

if (SDL_QUIT == windowEvent.type)
{
    break;
}

将检查收到的事件的类型。如果事件类型是 SDL_QUIT(IE 用户按下窗口上的关闭按钮),则“break”命令将被执行。如前所述,如果调用了break,它将退出循环,应用程序将关闭。

因此,总而言之,您的代码将进入无限 for 循环,因为它的表达式始终评估为 true (true == true)。在循环中,我们检查是否有新事件。如果我们确实得到了一个事件,请弄清楚它是什么。如果它是 SDL_QUIT,则从循环中中断。如果我们“*没有”得到一个事件,那么只需重新循环并再次检查一个事件。

【讨论】:

  • 非常感谢!我终于明白为什么它允许窗口保持打开状态以及为什么“while (true)”很有用
  • 谢谢!如果对您的问题有帮助,请接受回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多