SDL2/C++:我对在 SDL2 中将视口居中感到困惑

问题描述 投票:0回答:1

我一直在玩 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);

Result when divided by 2 Result when divided by 3 Example of skewed viewport after resizing window

关于时髦的居中,我尝试在互联网上查找SDL2为什么这样做,但显然无济于事。

关于倾斜,我尝试对计算进行一些更改,并查看我得到的数字是否确实正确,结果确实如此。

我期待这些改编会带来一些改变,但我所能做的就是更多地破坏它或什么也不改变。

c++ window sdl viewport centering
1个回答
0
投票

代码片段是正确的,因为它确实使视口成为适合视口的最大居中 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.