2013-06-02 53 views
3

pygame是否有任何方式blit東西屏幕內的屏幕。例如:如果您的面具的所有位都設置爲1,除了全角和全黑圖像,而不更改圖像,是否可以將左上角(與面具相同)保持清晰?只更新掩碼(而不是rect)會有所幫助。Pygame - 是否有任何方法只在一個面具blit或更新

+0

看看每個像素的alphas:http://www.pygame.org/docs/ref/surface.html 我自己對它們一無所知,但是文檔似乎暗示瞭如何去做 – ahuff44

+0

謝謝,我會嘗試。 – user1912132

+0

您是否要求具有透明度的精靈,或每個像素的可變阿爾法,還是隻更新屏幕的一小部分更改? – ninMonkey

回答

5

好吧,如果我正確理解你的問題,訣竅是BLEND_RGBA_MULT標誌。

我決定自己測試一下,因爲我很好奇。我開始與這個形象:

320x240 leaves

我做了一個形象的白色,我想要的圖像顯示,和透明度,我想它掩蓋。我甚至給了它不同程度的透明度,看看我是否可以得到模糊掩蔽。

Fuzzy circular mask

^^^你可能無法看到圖像,因爲它是白色透明的,但它的存在。您可以右鍵單擊並下載它。

我裝兩個圖像,確保使用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)) 

果然,它的工作:

result

下面是我用的完整代碼。

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")) 

它產生這樣的結果:

checkerboard mask result

現在我想在遊戲中使用這個!

+0

非常感謝,我還沒有測試過它,但它肯定是我尋找的東西:) – user1912132

2

所以,如果我理解正確,問題是 - 可以使用位掩碼進行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) 

然後你可以自由地讓你想和你的數據什麼,但那是另一回事。

+0

謝謝,我已經解決了與其他答案的問題,但這仍然有幫助:) – user1912132

相關問題