Pygame - 表面渐显/渐隐

4 投票
1 回答
5509 浏览
提问于 2025-04-17 17:42

我正在写一个应用程序,它会在PyGame窗口中显示一系列消息。为了让界面看起来更好,我决定给文字添加一个渐变的淡入淡出效果。

问题是:SDL只允许每个像素或每个表面的透明度,但不能同时使用这两种方式。所以我写了一个函数,根据想要的“层”透明度来重新计算每个像素的透明度,但这样做非常非常慢(即使是在2.7GHz的i7处理器上,帧率也降到了大约10帧每秒):

def apply_alpha(surface, alpha):
    for x in xrange(surface.get_width()):
        for y in xrange(surface.get_height()):
            color = surface.get_at((x, y))
            color.a = int(color.a * alpha)
            surface.set_at((x, y), color)
    return surface

完整示例在这里:https://gist.github.com/rshk/5072173(这不是实际的应用程序,只是一个相关的示例)

有没有什么办法可以加快速度?我看到可以直接访问底层缓冲区,这样可以避免创建Color对象,但通过这种方式更新透明度似乎更慢,因为要调用BufferProxy.write()方法。

也许使用硬件加速会有所帮助?我觉得理想的情况是在将表面绘制到背景时应用透明度,但我对这方面的知识不太多……

注意:改变文字颜色是不行的,因为背景不一定总是黑色……

1 个回答

6

为了将来有人参考,我按照@Xymostech的建议做了:创建了一个和渲染文本大小一样的表面,然后在那个表面上应用透明度,使用了.set_alpha()

更新版本在这里:https://gist.github.com/rshk/5072375

撰写回答