这是我的 C++ 代码:
#include <SDL2/SDL.h>
SDL_Window* gWindow = NULL;
SDL_Renderer* gRenderer = NULL;
int main( int argc, char* args[] )
{
SDL_Init( SDL_INIT_VIDEO );
gWindow = SDL_CreateWindow( "test", 0,0,640,480, SDL_WINDOW_SHOWN );
gRenderer = SDL_CreateRenderer(gWindow,-1,SDL_RENDERER_ACCELERATED);
SDL_Surface* x = SDL_CreateRGBSurface(0,50,50,32,0xFF,0xFF00,0xFF0000,0XFF000000);
SDL_Surface* y = SDL_CreateRGBSurface(0,640,480,32,0xFF,0xFF00,0xFF0000,0XFF000000);
SDL_Rect a = {0,0,50,50};
SDL_RenderClear(gRenderer);
SDL_FillRect(x,&a,SDL_MapRGBA(x->format,255,255,0,255));
SDL_Rect dest = {0,0,100,100};
SDL_BlitScaled( x, &a, y, &dest ); //Does nothing
dest.x = 200;
SDL_BlitSurface( x, &a, y, &dest );
SDL_Texture* t;
t = SDL_CreateTextureFromSurface(gRenderer,y);
SDL_RenderCopy(gRenderer,t,NULL,NULL);
SDL_RenderPresent(gRenderer);
SDL_Delay(2000);
return 0;
}
好吧,当你编译这段代码时,你会看到屏幕上只有一个矩形。函数 SDL_BlitScaled
什么都不做。
我正在使用 Archlinux、gcc 4.8.2、SDL 2.0.1
根据Retired Ninja的回答,我修改了代码:
#include <SDL2/SDL.h>
SDL_Window* gWindow = NULL;
SDL_Renderer* gRenderer = NULL;
int main( int argc, char* args[] )
{
SDL_Init( SDL_INIT_VIDEO );
gWindow = SDL_CreateWindow( "test", 0,0,640,480, SDL_WINDOW_SHOWN );
gRenderer = SDL_CreateRenderer(gWindow,-1,SDL_RENDERER_ACCELERATED);
SDL_Surface* x = SDL_CreateRGBSurface(0,50,50,32,0xFF,0xFF00,0xFF0000,0XFF000000);
SDL_Surface* y = SDL_CreateRGBSurface(0,640,480,32,0xFF,0xFF00,0xFF0000,0XFF000000);
SDL_SetRenderDrawColor(gRenderer,255,255,255,255);
SDL_RenderClear(gRenderer);
SDL_Rect a = {0,0,25,25};
SDL_FillRect(x,&a,SDL_MapRGBA(x->format,255,255,0,255));
a.x = 25;a.y = 25;
SDL_FillRect(x,&a,SDL_MapRGBA(x->format,255,0,0,255));
SDL_FillRect(y,&y->clip_rect,SDL_MapRGBA(y->format,255,0,255,128));
SDL_Rect dest = {0,0,100,100};
SDL_Rect x_rect = {0,0,50,50};
SDL_SetSurfaceBlendMode(x,SDL_BLENDMODE_NONE);
SDL_BlitScaled( x, &x_rect, y, &dest );
SDL_Texture* t;
t = SDL_CreateTextureFromSurface(gRenderer,y);
SDL_RenderCopy(gRenderer,t,NULL,NULL);
SDL_RenderPresent(gRenderer);
SDL_Delay(2000);
return 0;
}
又出现了一个问题,我尝试将x
复制到y
中,x
完全覆盖了y
,即使x
中有透明区域。但是如果我不使用SDL_BLENDMODE_NONE,复制到y
中的区域的alpha将设置为128,这不是我的目的。
最佳答案
用颜色填充 y
使其工作。
我补充说:
SDL_FillRect(y, &y->clip_rect, SDL_MapRGBA(x->format, 255, 0, 0, 255));
在 x
的 SDL_FillRect
之后它起作用了。
一些仅用 alpha 填充 y
的一部分的进一步实验让我相信 SDL_BlitScaled
不会从源表面复制 alpha,所以除非目标表面在目标矩形所在的位置有 alpha,您将看不到结果。
一些更多的实验表明,表面的默认混合模式是 SDL_BLENDMODE_BLEND
,将 y
的模式更改为 SDL_BLENDMODE_NONE
也可以使其正常工作.
关于c++ - SDL_BlitScaled 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20587999/