8

缩放 SDL 表面的正确方法是什么?我在网上找到了一种解释,但它需要逐个像素地重绘 Surface。似乎应该有某种方式通过 SDL 本地执行此操作,而不是像那样重绘图像。我无法在涵盖此内容的 SDL 文档中找到任何内容。我可以通过修改曲面的宽度和高度来毫无问题地调整曲面的大小,但生成的曲面会被剪裁。

4

3 回答 3

8

我知道这个答案太迟了,无法帮助提出这个问题的人,但我决定写这个来帮助任何偶然发现这个问题的人。在 SDL 2.0 中,您可以使用该SDL_BlitScaled()功能将表面缩放为目标SDL_Rect. LazyFoo有一个教程描述了这一点,或者查看这个文档

于 2015-06-22T00:04:30.420 回答
7

SDL 不支持缩放位图。根据SDL_BlitSurface的文档:

注意:SDL blitter (还)不具备像其他更复杂的 blitting 机制那样向上或向下缩放 blitted 表面的能力。如果你想缩放图像(例如使用 SDL_gfx),你必须自己想办法。

您可以在此处找到 SDL_gfx 。编写自己的 blitting 函数并没有那么糟糕,它可能是一个有趣且有用的学习实验(尽管你会重新发明轮子)。使用 OpenGL 也是一种选择,因为像缩放和旋转这样的东西可以在一个函数调用中完成。

于 2008-11-30T06:09:29.497 回答
1

为了完整起见,并且由于问题未指定 SDL 版本,因此可以在 SDL2 中使用 API 方法进行缩放SDL_RenderCopyEx。除了基本的 SDL2 库之外,不需要其他库。

int SDL_RenderCopyEx(SDL_Renderer*          renderer,
                     SDL_Texture*           texture,
                     const SDL_Rect*        srcrect,
                     const SDL_Rect*        dstrect,
                     const double           angle,
                     const SDL_Point*       center,
                     const SDL_RendererFlip flip)

通过设置一个的大小dstrect可以将纹理缩放到整数个像素。也可以同时旋转和翻转纹理。

从技术上讲,这不是缩放表面,而是缩放纹理。尽管在基于 SDL2 的应用程序中进行渲染之前,表面几乎总是被转换为纹理,但该过程应该是相关的。

参考:https ://wiki.libsdl.org/SDL_RenderCopyEx

像往常一样创建你的纹理:

surface = IMG_Load(filePath);
texture = SDL_CreateTextureFromSurface(renderer, surface);

当需要渲染它时,调用SDL_RenderCopyEx而不是SDL_RenderCopy

于 2015-02-17T10:54:13.517 回答