2012-04-22 65 views
0

我试图让一个透明SDL_Surface(做块就可以了半透明的矩形),这里是我做了什么:如何获得透明的SDL_Surface?

surface := SDL_CreateRGBSurface(SDL_SWSURFACE, XMAX*TILE_SIZE, 
YMAX*TILE_SIZE, BPP, 0, 0, 0, SDL_ALPHA_TRANSPARENT); 
SDL_FillRect(surface, nil, SDL_MapRGBA(surface^.format, 0, 0, 0, 0)); 

这仍然无法正常工作,我得到的表面是黑色的,而不是透明。任何想法?

奖励:为了避免多个translucide矩形在彼此顶部的blitting,有什么办法可以删除这些矩形,然后blit新的一个(没有blitting的背景......)?

回答

0

从查看docs for SDL_CreateRGBSurface,我认为您需要将SDL_SWSURFACE替换为SDL_SRCALPHA

对于奖金的一部分,你可能如果这不是一种选择,你愿意花一些内存试试第一个获得硬件加速工作......但是:

  • 首先,绘制一个矩形前,制作它下面的像素的副本。

  • 要擦除最上面的矩形,只需重新存储存储的背景图像。

  • 要擦除其他任何矩形,请重新布局其背景,然后重新从其上方重新绘制矩形的重叠部分。

+0

mmh ...即使这个标志似乎有必要有一个透明的表面(因为它是在文档中暗示),它仍然不能解决我的问题:/。实际上,它不会改变任何东西......当我使用带有RGBA像素的SDL_FillRect(和alpha值不同于255)时,我仍然可以看到它们完全不透明。 对于我的“奖金”部分,问题是在这种情况下,我的背景将是......没有。或者更确切地说:透明像素。 我不知道是否已经blitting表面上的透明像素会做什么? – halflings 2012-05-05 21:59:01

+0

等一下。你希望表面是透明的,还是你希望_window_透明?如果是窗口,则需要与操作系统交谈,而不是SDL本身。在Win32上,请参阅[这个问题](http://stackoverflow.com/questions/3970066/creating-a-transparent-window-in-c-win32) - 这是为c + +,但你可以谈谈在德尔福相同的DLL。 ..你可能需要深入SDL源代码才能使它工作 - (也许不是。我从来没有尝试过。 – tangentstorm 2012-05-06 08:32:00

+0

至于blitting透明像素:为什么不呢?先禁用混合,然后重新启用它(如果你不能获得透明窗口的工作,你也可以让操作系统给你一个屏幕截图并从那里复制像素 - 以前是透明窗口的唯一方法有关详细信息,请参见[这篇旧文章](http://onjava.com/onjava/excerpt/swinghks_hack41/index.html)。) – tangentstorm 2012-05-06 08:36:38