Sdl 1.3:如何实现简单的scale-9-grid用于图像大小调整?

时间:2011-06-25 17:29:23

标签: c++ c sdl nine-patch scale9grid

我们有一个像这样的图像:

enter image description here

我们有4个坐标顶部:10,底部:10,左:10,右:10我们调整大小为newWidth:100,newHeight:35我们有一些SDL_Rect Sprite是从某些{{{ 1}}如何在Sprite上执行这样的resize转换?

那么如何在SDL中实现9切片缩放?

1 个答案:

答案 0 :(得分:0)

我已经制作了一个演示项目,其中使用在这里进行https://github.com/cxong/sdl2-9-slice

,执行9切片渲染

screenshot

看看srcrect函数并根据需要复制它-它已获得许可。

关键是使用SDL_RenderCopy()dstrectsrcrect参数-前者是要渲染的源纹理的哪一部分,后者是目标(渲染目标)的哪一部分)呈现。

对于9切片,拐角按原样复制;对于中间部分,取决于您想要呈现的方式-拉伸还是重复-dstrect是相同的,但是int render( SDL_Renderer *renderer, SDL_Surface *s, SDL_Texture *t, int x, int y, int top, int bottom, int left, int right, int w, int h, bool repeat) { const int srcX[] = {0, left, s->w - right}; const int srcY[] = {0, top, s->h - bottom}; const int srcW[] = {left, s->w - right - left, right}; const int srcH[] = {top, s->h - bottom - top, bottom}; const int dstX[] = {x, x + left, x + w - right, x + w}; const int dstY[] = {y, y + top, y + h - bottom, y + h}; const int dstW[] = {left, w - right - left, right}; const int dstH[] = {top, h - bottom - top, bottom}; SDL_Rect src; SDL_Rect dst; for (int i = 0; i < 3; i++) { src.x = srcX[i]; src.w = srcW[i]; dst.w = repeat ? srcW[i] : dstW[i]; for (dst.x = dstX[i]; dst.x < dstX[i + 1]; dst.x += dst.w) { if (dst.x + dst.w > dstX[i + 1]) { src.w = dst.w = dstX[i + 1] - dst.x; } for (int j = 0; j < 3; j++) { src.y = srcY[j]; src.h = srcH[j]; dst.h = repeat ? srcH[j] : dstH[j]; for (dst.y = dstY[j]; dst.y < dstY[j + 1]; dst.y += dst.h) { if (dst.y + dst.h > dstY[j + 1]) { src.h = dst.h = dstY[j + 1] - dst.y; } const int res = SDL_RenderCopy(renderer, t, &src, &dst); if (res != 0) { return res; } } } } } return 0; } 会拉伸或重复。

另一件事是SDL does not do texture repeating(尚未)。因此,如果要渲染为重复模式,则需要使用循环。

以下是项目死亡时的功能:

{{1}}