2013-09-27 66 views
2

我想將一個numpy數組的alpha值應用到曲面上。我可以這樣做,但是在這個操作之後表面仍然被鎖住,這樣我就不能將表面粘到顯示器上。爲什麼Surface.unlock無法解鎖表面以進行blitting?

下面是一個簡單的測試用例,使用alpha數組,g,醃製here

import pygame as pg 

pg.init() 
screen = pg.display.set_mode((600, 600)) 

s = pg.Surface((100, 100)).convert_alpha() 
s.fill((126, 126, 126)) # make it grey 
pxa = pg.surfarray.pixels_alpha(s) # reference the alpha values 

pxa[::] = g # g is the array of alpha values 
del pxa # shouldn't deleting the array be enough to unlock the surface? 
s.unlock() # explicitly unlock for good measure 

s.get_locked() # returns True 

那麼是什麼給?無論如何,我嘗試着將表面點擊到screen,但是(可預測地)我得到一個關於s仍然被鎖定的錯誤。

建議將非常歡迎!

+0

我認爲您應該嘗試運行該示例。它不會運行,當您修復它時,問題不會發生。 – Veedrac

+0

@Veedrac,哈!這就是我從翻譯工作中得到的結果。我已經更正了代碼,但是我仍然遇到同樣的問題... – blz

+0

我運行新代碼並且沒有鎖。你可以嘗試's.get_locks()'來查看鎖定它的內容。請注意,您應該使用'pg.Surface((100,100),flags = pg.SRCALPHA)'從最新問題的更新回答中避免需要啓動顯示(顯示非常分散注意力)。 //這可能是因爲你在一個妨礙正確刪除的環境中運行;儘管實際上沒有定義好的行爲,但對我來說,總是覺得「del」是必需的。來自文檔的 – Veedrac

回答

1

製作一個精靈類並將這些值放入更新函數中。這樣,數組將在函數的範圍內被創建和銷燬。下面是一個例子,您可以通過按空格鍵使灰色塊變爲透明:

import pygame 
from pygame.locals import QUIT, KEYDOWN, K_ESCAPE, K_SPACE, SRCALPHA 


class Game(object): 
    def __init__(self): 
     pygame.init() 
     self.width, self.height = 800, 800 
     pygame.display.set_caption("Surfarray test") 
     self.screen = pygame.display.set_mode((self.width, self.height)) 
     self.background = pygame.Surface((self.width, self.height)) 
     self.background.fill((255, 255, 255)) 
     self.background.convert() 
     self.bar = pygame.Surface((200, 100)) 
     self.bar.fill((255, 0, 0)) 
     self.bar.convert() 

     self.sprite = pygame.sprite.GroupSingle() 
     self.sprite.add(CustomSprite(pygame.Rect(5, 5, 100, 100))) 

    def input(self): 
     for event in pygame.event.get(): 

      if event.type == QUIT: 
       return False 

      if event.type == KEYDOWN: 
       if event.key == K_ESCAPE: 
        return False 
       if event.key == K_SPACE: 
        # make bar transparent by pressing the space bar 
        self.sprite.update() 

    def main(self): 
     while True: 
      if self.input() is False: 
       return False 
      self.draw() 

    def draw(self): 
     self.screen.blit(self.background, (0, 0)) 
     self.screen.blit(self.bar, (5, 5)) 
     self.sprite.draw(self.screen) 
     pygame.display.update() 


class CustomSprite(pygame.sprite.Sprite): 
    def __init__(self, rect): 
     pygame.sprite.Sprite.__init__(self) 
     self.rect = rect 
     # SRCALPHA flag makes the pixel format include per-pixel alpha data 
     self.image = pygame.Surface((rect.width, rect.height), SRCALPHA) 
     self.image.convert_alpha() 
     self.image.fill((126, 126, 126)) 

    # magic happens here 
    def update(self): 
     pxa = pygame.surfarray.pixels_alpha(self.image) 
     pxa[:] = 100 # make all pixels transparent 

if __name__ == "__main__": 
    game = Game() 
    game.main() 
+0

這是一個非常好的主意,特別是考慮到我打算製作一個精靈類。一旦我得到它的工作,我會給你一個機會,接受。謝謝一堆! – blz

相關問題