我一直在玩 SDL2,仍在学习中。当尝试将渲染器的视口居中时,将窗口大小和视口大小之间的差异的一半添加到视口的 x 和 y 坐标似乎是不正确的。相反,您需要将这个差异除以 3?我对此很困惑,希望有人能澄清一下。 目标是在 16:9 窗口上渲染 4:3 视口。
除此之外,当我手动调整窗口大小时,视口的纵横比开始完全倾斜。
SDL_Rect windowRect{ };
SDL_GetWindowSize(m_pWindow, &windowRect.w, &windowRect.h);
SDL_Rect newViewport{ };
float aspectRatio{ 4 / 3.f };
if (static_cast<float>(windowRect.w) / windowRect.h >= aspectRatio)
{
newViewport.h = windowRect.h;
newViewport.w = windowRect.h * aspectRatio;
newViewport.x = (windowRect.w - newViewport.w) / 2; // interchange this between 2 and 3
}
else
{
newViewport.w = windowRect.w;
newViewport.h = windowRect.w / aspectRatio;
newViewport.y = (windowRect.h - newViewport.h) / 2; // interchange this between 2 and 3
}
SDL_RenderSetViewport(m_pRenderer, &newViewport);
关于时髦的居中,我尝试在互联网上查找SDL2为什么这样做,但显然无济于事。
关于倾斜,我尝试对计算进行一些更改,并查看我得到的数字是否确实正确,结果确实如此。
我期待这些改编会带来一些改变,但我所能做的就是更多地破坏它或什么也不改变。
代码片段是正确的,因为它确实使视口成为适合视口的最大居中 4:3 矩形。问题出在我的渲染方法中,该方法传递了一个
SDL_Rect
,并使用 SDL_GetViewport()
作为参数进行填充。相反,您需要传递 NULL
或任何类型的零值才能正确填充视口。
void RenderViewport() const
{
SDL_RenderFillRect(m_pRenderer, NULL);
}
void RenderViewport() const
{
SDL_Rect viewport{};
SDL_RenderGetViewport(m_pRenderer, &viewport);
SDL_RenderFillRect(m_pRenderer, &viewport);
}