缩放SDL曲面的正确方法是什么?我在网上找到了一个解释,但它需要逐像素地重新绘制Surface。似乎应该有一些方法通过SDL本地执行此操作,而不是像这样重新绘制图像。我无法在SDL文档中找到任何涉及此内容的内容。通过修改曲面宽度和高度,我可以毫无问题地调整曲面大小,但会剪切生成的曲面。
答案 0 :(得分:7)
SDL不支持缩放blitting。根据{{3}}的文件:
注意:SDL阻击器(尚未) 有能力缩放 像上面或下面的blitted表面 与其他更复杂的情况 blitting机制。你必须 如果你自己想办法的话 你想缩放图像(例如使用 SDL_gfx)。
你可以找到SDL_gfx SDL_BlitSurface。编写自己的blitting函数并不是那么糟糕,它可能是一个有趣且有用的学习实验(尽管你将重新发明轮子)。使用OpenGL也是一种选择,因为缩放和旋转等功能可以在单个函数调用中完成。
答案 1 :(得分:5)
我知道这个答案为时已晚,无法协助提出要求的人,但我决定写这个来帮助那些偶然发现这个问题的人。在SDL 2.0中您可以使用SDL_BlitScaled()
函数将曲面缩放为目标SDL_Rect
。 LazyFoo有一个教程可以对此进行描述,或者查看此documentation。
答案 2 :(得分:1)
为了完整性,并且因为问题没有指定SDL版本,可以使用API方法SDL_RenderCopyEx
在SDL2中进行缩放。除了基本的SDL2 lib之外,不需要额外的库。
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