SDL_BlitScaled不起作用

时间:2013-12-14 20:39:51

标签: c++ sdl

这是我的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,这不是我的目的。

1 个答案:

答案 0 :(得分:3)

使用颜色填充y可以使其正常工作。

我补充说:

SDL_FillRect(y, &y->clip_rect, SDL_MapRGBA(x->format, 255, 0, 0, 255));
<{1>} SDL_FillRect之后的

并且有效。

用alpha填充x的一部分的一些进一步实验让我相信y没有从源表面复制alpha,所以除非dest表面具有目标rect的alpha你会看不到结果吗?

更多实验表明,曲面的默认混合模式为SDL_BlitScaled,将SDL_BLENDMODE_BLEND的模式更改为y也可以使其正常工作。