pygame是否有任何方式blit東西屏幕內的屏幕。例如:如果您的面具的所有位都設置爲1,除了全角和全黑圖像,而不更改圖像,是否可以將左上角(與面具相同)保持清晰?只更新掩碼(而不是rect)會有所幫助。Pygame - 是否有任何方法只在一個面具blit或更新
回答
好吧,如果我正確理解你的問題,訣竅是BLEND_RGBA_MULT
標誌。
我決定自己測試一下,因爲我很好奇。我開始與這個形象:
我做了一個形象的白色,我想要的圖像顯示,和透明度,我想它掩蓋。我甚至給了它不同程度的透明度,看看我是否可以得到模糊掩蔽。
^^^你可能無法看到圖像,因爲它是白色透明的,但它的存在。您可以右鍵單擊並下載它。
我裝兩個圖像,確保使用convert_alpha()
:
background = pygame.image.load("leaves.png").convert_alpha()
mask = pygame.image.load("mask-fuzzy.png").convert_alpha()
然後來掩蓋形象,我就進行掩蓋的圖像的副本,
masked = background.copy()
...我使用BLEND_RGBA_MULT
,
masked.blit(mask, (0, 0), None, pygame.BLEND_RGBA_MULT)
......並且我畫了面具它到了屏幕。
display.blit(masked, (0, 0))
果然,它的工作:
下面是我用的完整代碼。
import pygame
from pygame.locals import *
pygame.init()
display = pygame.display.set_mode((320, 240))
background = pygame.image.load("leaves.png").convert_alpha()
mask = pygame.image.load("mask-fuzzy.png").convert_alpha()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# draw
display.fill(Color(255, 0, 255))
masked = background.copy()
masked.blit(mask, (0, 0), None, pygame.BLEND_RGBA_MULT)
display.blit(masked, (0, 0))
pygame.display.flip()
如果您想要一個變量掩碼,您可以嘗試手動編輯一個表面並將其用作掩碼。
編輯:這是通過編輯曲面生成掩碼的例子:
mask = pygame.Surface((320, 240), pygame.SRCALPHA)
for y in range(0, 240):
for x in range(0, 320):
if (x/16 + y/16) % 2 == 0:
mask.set_at((x, y), Color("white"))
它產生這樣的結果:
現在我想在遊戲中使用這個!
非常感謝,我還沒有測試過它,但它肯定是我尋找的東西:) – user1912132
所以,如果我理解正確,問題是 - 可以使用位掩碼進行blitting。答案是肯定的,不是。 AFAIK,在pygame中不支持1位掩碼,也就是說,必須使用32位RGBA(SRCALPHA標誌)作爲源表面以透明方式傳輸,在這種情況下,您使用8位掩碼= 256級透明度每像素,這在之前的答案中有所描述。另一種選擇是使用'colorkey'blitting。在這種情況下,它與1位掩碼更類似,並且與標準的24-bpp RGB表面一起使用。您只需設置源表面中不想寫入目標的顏色。請參閱文檔中的'Surface.set_colorkey'。 然而,使用colorkey方法的問題是,您可能會意外地在源文件中包含一些像素,它們的顏色與colorkey顏色相同,但您仍想繪製該顏色。所以你一定要小心。我個人使用RGBA表面進行掩蔽,它更強大,但幾乎總是我不需要8位,1位掩碼就足夠了。所以在我看來,有點奇怪的是,對於每個位掩碼傳輸都沒有支持。緩衝區翻轉也是如此 - 您可以只使用一列矩形來描述屏幕緩衝區的更新區域。更靈活和直接的將是使用位掩碼,但afaik也是不可能的。可能將位掩碼轉換爲矩形列表是方法,但我沒有嘗試。 第三個選項是不使用pygame的表面,並使用numpy的爲您的數據,然後使用數組阻擊器:
pygame.surfarray.blit_array(Destination_surface, my_array)
然後你可以自由地讓你想和你的數據什麼,但那是另一回事。
謝謝,我已經解決了與其他答案的問題,但這仍然有幫助:) – user1912132
- 1. 更新Pygame表面的一個方面
- 2. pygame blitting只更新表面
- 3. Pygame blit在另一個之上?
- 4. Pygame Blit Once?
- 5. JavaScript是否有blit或memcpy命令?
- 6. 在Pygame中更新一個表面
- 7. 應用一個方面只有具有
- 8. python pygame blit函數
- 9. UIViewController Intercommunication,是否有任何強迫UIViewController更新的方法?
- 10. dc-> DrawLine()一堆或一個blit是否便宜?
- 11. 是否有任何asp.net或jquery wysiwyg編輯器在更新面板中工作
- 12. 有一種方法可以檢查Hibernate方法.saveOrUpdate()是否插入或更新?
- 13. 在CRUDRespository中更新或保存更新,是否有任何可用選項
- 14. 在Django或Python中是否有任何方法用於預測?
- 15. Pygame屏幕不會blit
- 16. 是否有任何工具或API來自動更新數據庫結構
- 17. python/pygame鼠標位置不更新(blit函數)
- 18. 是否有任何方法只能在更新MySQL觸發器之前更改記錄?
- 19. 是否有任何工具自動更新Javadoc?
- 20. 是否有一個ruby方法只返回一個塊的值?
- 21. 任何好方法只更新網頁的一部分?
- 22. 是否有任何方法只安裝tfs命令行?
- 23. pygame有沒有方法檢測矩形是否完全在面罩內?
- 24. Pygame;方法來加載,blit和移動圖像不移動
- 25. simpleConsumer模塊是否有任何解決方法來只讀取新消息?
- 26. 是否有可能訂閱任何頁面的實時更新?
- 27. Py2exe(Python的pygame的) - 有沒有一個更簡單的方法?
- 28. 是否有任何方法像「popoverPresentationControllerWillDismissPopover」
- 29. LINQ的任何方法是否有效?
- 30. pygame精靈沒有渲染或更新
看看每個像素的alphas:http://www.pygame.org/docs/ref/surface.html 我自己對它們一無所知,但是文檔似乎暗示瞭如何去做 – ahuff44
謝謝,我會嘗試。 – user1912132
您是否要求具有透明度的精靈,或每個像素的可變阿爾法,還是隻更新屏幕的一小部分更改? – ninMonkey