SDL_RenderSetScale
将相应地缩放坐标,直到与SDL_RenderCopyEx
一起使用旋转。 SDL似乎应用缩放预旋转,因此旋转纹理的宽高比是错误的。例如,旋转90度的纹理将使x和y缩放反转。我试图计算一个公式来抵消这种缩放,但结果不是很好。
我还注意到,使用SDL_RenderDrawLine
绘制的直线根据缩放绘制了不同的厚度,但仍然按照每个屏幕像素绘制对角线。
有没有其他人有这个问题?还有另一种方法来获得理想的结果吗?有没有计划修复SDL2所以缩放效果始终如一?
唉,不是。使用不同的宽度和高度缩放因子,问题变得明显。尝试:
SDL_RenderSetScale(renderer, 4.0f, 2.0f);
SDL_Rect rect = { 16, 16, 128, 128 };
SDL_RenderCopyEx(renderer, tex, NULL, &rect, 90.0, NULL, SDL_FLIP_NONE);
......你会看到问题所在。
您可能希望原始的方形纹理现在是一个宽矩形,但它是一个高大的矩形。
在旋转之前应用缩放 - 而我个人希望在旋转之后应用缩放,因为SDL_RenderSetScale()的整个点似乎是允许选择独立坐标系,但是如果两者的宽高比如此坐标系不一样,任何旋转的纹理都会显示错误。
罗尼
这问题已在四年前提出,但我仍然面临这个问题。所以,如果有人过来,这是我的答案。
Lignum关于SDL版本控制的假设是错误的。实际上,我正在使用SDL 2.0.9,这个问题仍然有用。正如Ronnie指出的那样,只有当未保留纵横比时才会出现此问题(在Lignum代码示例中,纵横比保持不变,因为沿x和y轴的比例因子相等)。
我担心的唯一解决方案是简单地避免使用SDL_RenderSetScale并在SDL_RenderCopyEx中手动缩放目标矩形的坐标。
使用此代码,我担心我无法重现此问题:
SDL_RenderSetScale(renderer, 4.0f, 4.0f);
SDL_Rect rect = { 16, 16, 128, 128 };
SDL_RenderCopyEx(renderer, tex, NULL, &rect, 90.0, NULL, SDL_FLIP_NONE);
这完全没问题,图像旋转了90°,缩放了4倍。由于这是在我的回复前2年询问,我认为这可能是SDL 2.0.3中的一个错误,因为我是使用SDL 2.0.5。
无论如何,这应该发生在最新版本上,并非所有的希望都会丢失。使用SDL_RenderSetScale
的另一种方法是简单地将目标矩形的宽度和高度乘以所需的比例,根据我的经验,这也适用。考虑到你将矩形直接传递到SDL_RenderCopyEx
这一事实,该功能在转动时应该牢记这一点。