SDL event.window.windowID 与 GetWindowID()
SDL event.window.windowID vs GetWindowID()
event.window.windowID
和SDL_GetWindowID()
的输出有什么区别?
为什么 std::cout << m_SDLEvent.window.windowID << std::endl;
在控制台中输出 1819558491 而 std::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。
event.window.windowID
和SDL_GetWindowID()
的输出有什么区别?
为什么 std::cout << m_SDLEvent.window.windowID << std::endl;
在控制台中输出 1819558491 而 std::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。