【问题标题】:How to get a transparent SDL_Surface?如何获得透明的 SDL_Surface?
【发布时间】:2012-04-22 07:42:19
【问题描述】:

我正在尝试获得一个透明的 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));

这仍然不起作用,我得到的表面是黑色而不是透明的。有什么想法吗?

奖励:为避免多个半透明矩形相互重叠,有什么方法可以删除这些矩形,然后对新的矩形进行 blitting(无需再次对背景进行 blitting ...)?

【问题讨论】:

    标签: delphi sdl pascal


    【解决方案1】:

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

    对于奖励部分,您可以先尝试让硬件加速工作......但如果这不是一个选项并且您愿意花费一些内存:

    • 首先,在绘制一个矩形之前,复制它下面的像素。

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

    • 要擦除任何其他矩形,请重新填充其背景,然后从后到前重新绘制其顶部矩形的重叠部分。

    【讨论】:

    • Mmh ...即使这个标志似乎需要有一个透明的表面(正如它在文档中暗示的那样),它仍然不能解决我的问题:/。实际上,它并没有改变任何东西......当我将 SDL_FillRect 与 RGBA 像素(以及不同于 255 的 alpha 值)一起使用时,我仍然看到它们完全不透明。对于我的“奖励”部分,问题是在这种情况下我的背景将是......什么都没有。或者更准确地说:透明像素。我不知道在已经 blitted 的表面上 blitting 透明像素是否会做任何事情?
    • 等等。您希望表面是透明的,还是希望窗口 是透明的?如果是窗口,您需要与操作系统对话,而不是 SDL 本身。在 Win32 上,请参阅 this question - 它适用于 c++,但您可以在 delphi 中与相同的 dll 对话...您实际上可能必须深入研究 SDL 源代码才能使其工作 - (也许不是。我从未尝试过.
    • 至于blitting透明像素:为什么不呢?只需先禁用混合。然后重新启用它以标记叠加层。 (如果你不能让透明窗口的东西工作,你也可以要求操作系统给你一个截图并从那里复制像素——这曾经是在 Java 中获得透明窗口的唯一方法。见@ 987654323@了解详情。)
    • 不,我不想要透明窗口!只是一个透明的表面。您是否有任何队列为什么即使我所做的一切(SDL_SRCALPHA 事情,填充 RGBA 像素等)表面也不会透明?
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多