Pygame - 表面淡入/淡出

时间:2013-03-02 17:52:49

标签: python sdl pygame

我正在编写一个应用程序,显示PyGame窗口中出现的消息列表;为了让事情变得更漂亮,我决定为文本添加一个很好的淡入/淡出效果。

问题是:SDL仅允许每像素或每表面alpha,而不是两者。所以我编写了一个函数,根据想要的“图层”不透明度重新计算像素alpha,但它当然非常非常非常慢(即使在核心i7 @ 2.7GHz上,它也会下降到~10FPS):

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对象的实例化,但是以这种方式更新alphas似乎更慢,调用BufferProxy.write()方法..

也许使用硬件加速的东西会有帮助吗?我认为这里的理想是在将表面涂抹到背景上时应用alpha,但我对这种事情并不是很专业..

注意:更改文字颜色不是偶然的,因为背景可能并不总是黑色..

1 个答案:

答案 0 :(得分:6)

由于这可能作为某人的未来参考,我按照@Xymostech的建议做了:创建另一个具有相同大小的渲染文本的表面,并使用.set_alpha()在该表面上应用alpha。

此处更新版本:https://gist.github.com/rshk/5072375