2013-03-02 125 views
4

我正在編寫一個應用程序,顯示PyGame窗口中出現的消息列表;爲了讓事情變得更漂亮,我決定爲文本添加一個很好的淡入/淡出效果。Pygame - 表面淡入/淡出

問題是:SDL只允許每個像素或每個表面的alpha,而不是兩個。所以我寫了一個函數,根據想要的「圖層」不透明度重新計算像素alpha,但它當然非常非常慢(甚至在2.7GHz的核心i7上,它降至〜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對象的實例,但它似乎更慢更新阿爾法這種方式,調用BufferProxy.write()方法..

也許使用硬件加速的東西將幫助?我認爲這裏的理想是應用alpha而blitting表面到背景上,但我並不是很擅長這類東西。

說明:更改文字顏色不是一個機會,因爲背景可能並不總是黑色......

+2

爲什麼你不製造另一個表面?然後你可以訪問每個表面的阿爾法... – Xymostech 2013-03-02 18:00:55

+0

我試過了,但它似乎沒有效果。 – redShadow 2013-03-02 18:17:54

+0

..你說得對,我再次嘗試,在這個例子中,它的工作原理!我懷疑在「真實世界」應用程序中有一些標誌有問題。感謝您的建議! – redShadow 2013-03-02 18:22:54

回答

6

因爲這可能會成爲某人的未來參考,所以我按照@Xymostech的建議做了:創建具有相同大小的渲染文本的另一個表面,並在該表面上應用alpha ,使用.set_alpha()

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

+0

好想法。老實說,我不認爲文本會需要這個,因爲它並不真的有自己的alpha通道,所以你可以set_alpha它,但這看起來非常有用。 – 2014-12-08 17:08:02