如何在 SDL 中缩放精灵?
5 回答
SDL 不直接提供缩放功能,但还有一个名为 SDL_gfx 的附加库,它提供旋转和缩放功能。还有另一个名为 Sprig 的库,它提供了类似的功能。
如果您使用 SDL_RenderCopy() 从纹理中获取精灵,则可以进行缩放,但我不能保证您具有抗锯齿功能。
使用函数 SDL_RenderCopy() 传递 4 个参数:
- 一个指向渲染器的指针(你要渲染的地方)。
- 指向纹理的指针(您将在其中获取精灵)。
- 指向源矩形的指针(在纹理上获得精灵的区域和位置)。
- 和指向 dest rect 的指针(要绘制的渲染器上的区域和位置)。
你应该只修改你的 dest rect 例如,如果你要渲染一个 300 x 300 的图像并且你想要它缩放,你的 dest rect 应该是 150 x 150 或 72 x 72 或者你想要缩放的任何值。
您没有提供任何代码,所以我假设您使用的是纹理和 SDL_Renderer:
使用 SDL_RenderCopy() 时,纹理将被拉伸以适合目标 SDL_Rect,因此如果您使目标 SDL_Rect 更大或更小,您可以执行纹理的简单缩放。
Ibrahim CS 的解决方案有效。
让我扩展这个解决方案并提供代码。要注意的另一件事是计算新位置 (x,y),左上角是原点以渲染缩放纹理。
我这样做
// calculate new x and y
int new_x = (x + texture->w/2) - (texture->w/2 * new_scale);
int new_y = (y + texture->h/2) - (texture->h/2 * new_scale);
// form new destination rect
SDL_Rect dest_rect = { new_x, new_y, texture->w * scale, texture->h * scale };
// render
SDL_RenderCopy(renderer, texture, NULL, &dest_rect);
假设texture
isSDL_Texture
和renderer
is SDL_Renderer
,并且您从输入纹理完全渲染到目的地。
如果您改用SFML,那么您将获得一组非常相似的跨平台功能,但图形是硬件加速的,并且缩放和旋转等功能是免费的,无论是在不需要额外的依赖项还是在不占用明显的 CPU 方面操作时间。