SDL event.window.windowID 与 GetWindowID()

SDL event.window.windowID vs GetWindowID()

event.window.windowIDSDL_GetWindowID()的输出有什么区别?

为什么 std::cout << m_SDLEvent.window.windowID << std::endl; 在控制台中输出 1819558491std::cout << SDL_GetWindowID(m_SDLWindow) << std::endl; 输出 1 ?

如何在下面的方法中获得我的 SDL_Window* 的正确 ID?

void InputManager::Update()
    {
        SDL_PollEvent(&m_SDLEvent);

                switch (m_SDLEvent.type)
                {
                case SDL_QUIT:
                    std::cout << m_SDLEvent.window.windowID << std::endl;
                    SDL_HideWindow(SDL_GetWindowFromID(m_SDLEvent.window.windowID));
                    break;
                }
    }

您看到的是乱码 window ID,因为您访问了一个无效的联合字段。那是未定义的行为。

如果 m_SDLEvent.type == SDL_WINDOWEVENT.

,您只能访问 m_SDLEvent.window

但是如果m_SDLEvent.type == SDL_QUIT,你必须使用m_SDLEvent.quit结构,它没有window id的字段(因为SDL_QUIT不特定于window,但意味着整个应用程序应该关闭)。

好的,HolyBlackCat 的回答让我找到了正确的方向。

而不是使用 SDL_QUIT(这是整个应用程序的退出事件,而不是一个 window)我应该检查 SDL_WINDOWEVENT_CLOSE 这是一个 SDL_WINDOWEVENT 可以由 m_SDLEvent.window.event 而不是 m_SDLEvent.type

接收

所以代码现在看起来像这样:

void InputManager::Update()
    {
        SDL_PollEvent(&m_SDLEvent);

        if (m_SDLEvent.type == SDL_WINDOWEVENT)
        {
            switch (m_SDLEvent.window.event)
            {
            case SDL_WINDOWEVENT_CLOSE:
                std::cout << m_SDLEvent.window.windowID << std::endl;
                SDL_HideWindow(SDL_GetWindowFromID(m_SDLEvent.window.windowID));
                break;
            }
        }
    }

现在 std::cout << m_SDLEvent.window.windowID << std::endl; 输出正确的 ID。