c++ - SDL_BlitScaled 不起作用

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

最佳答案

用颜色填充 y 使其工作。

我补充说:

SDL_FillRect(y, &y->clip_rect, SDL_MapRGBA(x->format, 255, 0, 0, 255));

xSDL_FillRect 之后它起作用了。

一些仅用 alpha 填充 y 的一部分的进一步实验让我相信 SDL_BlitScaled 不会从源表面复制 alpha,所以除非目标表面在目标矩形所在的位置有 alpha,您将看不到结果。

一些更多的实验表明,表面的默认混合模式是 SDL_BLENDMODE_BLEND,将 y 的模式更改为 SDL_BLENDMODE_NONE 也可以使其正常工作.

关于c++ - SDL_BlitScaled 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20587999/

相关文章:

c++ - 如何从元组 C++ 中过滤重复类型

c++ - 我应该如何在 C++ 中实现线程池?

C++:解析一个 132x65 的二进制文件

c++ - 如何声明采用模板类参数的模板类

c++ - 加载相对于二进制文件的图像

c++ - Tarjan 实现中反复出现的衔接点

c++ - SDL 软件渲染比硬件渲染更快

c++ - SDL不绘制图像

c++ - 如何在 OGRE 中使用 SDL?

c++ - 简单 SDL 引擎中的链接错误