2011-09-12 86 views
1

我想寫使用Python/pygame的是位塊傳輸彼此每個屏幕刷新的頂部幾層2D遊戲。我的基本設置(從底部到頂部):如何有效清除pygame alpha圖層?

  • 背景:表面(非透明的),以不同的速率比其餘
  • 中景滾動:SRCALPHA透明表面(靜態)
  • 播放器/精靈/敵人:子畫面組
  • Forground:SRCALPHA透明表面(靜態)

現在,我的blitting這四個層中的一個上的另一個每個屏幕的頂部。背景以不同於其他三層的速度滾動,這就是爲什麼我將它與中景分開的原因。由於我現在已經構建了遊戲,它以60fps的速度運行在我相當謙虛的筆記本電腦上。

- 丁我在與子畫面組,其中我直接位圖傳輸到屏幕上的麻煩。不得不根據我當前的視口來調整每個精靈的矩形,這似乎是一種難以編程的方式,我想要一個更優雅的解決方案。

我很想做塊精靈到另一個透明的表面,我可以管理,但therin在於我的問題:我找不到清除透明層沒有我一半的性能的方法。一些我已經試過設置的:

  • 我試圖填充白色表面與混合模式rgba_sub層(surf.fill((255255255255),區域,BLEND_RGBA_SUB)) - 這是超級,超慢
  • 空白麪。我試圖surface.copy() - 這是快,但仍然減半我FPS
  • 我嘗試了精靈與中景層pygame.sprite.LayeredUpdates組合和使用,以更新精靈。這對性能沒有影響,但在中間層透明的情況下不起作用。我在背景圖層上找到了精靈的蹤跡。

到目前爲止我發現的最好的解決方案是我目前直接在屏幕上繪製精靈的設置。它看起來不錯,運行速度很快,但是很難管理,因爲我必須確保每個sprite的rect根據視口的每一幀進行調整。它也使得碰撞檢測困難。

是否有另一種快速清除pygame透明表面的方法?快速,每秒可以完成60次以上?另外,是否有我的圖層設置,仍然會達到相同的效果?

回答

1

我想通了,通過應用彼得的解決方案有選擇地將層清除精靈只有透明層的一個快速方法:

for s in self.level.sprites: 
    spritelayer.fill((0), s.rect) 

這似乎是工作的罰款(消除一切每一幀),並且仍然以60fps運行。

1

的Surface.fill()將清除所有R,G,B和A的值。

>>> img = pygame.image.load("hasalpha.png") 
>>> print img.get_at((300, 300)) 
(238, 240, 239, 255) 
>>> surface.fill(0) 
>>> print img.get_at((300, 300)) 
(0, 0, 0, 0) 

這聽起來像這樣會做你所描述的。如果你正試圖用alpha值做更具體的事情,pygame.surfarray.pixel函數可以給你直接可編輯的值。這將很快,但需要numpy作爲依賴。

+0

這似乎比surf.fill((255,255,255,255),area,BLEND_RGBA_SUB)運行得更快,但是當我在整個圖層上運行它時仍然使性能減半。 – drinkdecaf

+0

啊哈!但是,當我只將它應用於sprite rects時,它會運行FAST:D謝謝先生! – drinkdecaf