製作一個精靈類並將這些值放入更新函數中。這樣,數組將在函數的範圍內被創建和銷燬。下面是一個例子,您可以通過按空格鍵使灰色塊變爲透明:
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()
我認爲您應該嘗試運行該示例。它不會運行,當您修復它時,問題不會發生。 – Veedrac
@Veedrac,哈!這就是我從翻譯工作中得到的結果。我已經更正了代碼,但是我仍然遇到同樣的問題... – blz
我運行新代碼並且沒有鎖。你可以嘗試's.get_locks()'來查看鎖定它的內容。請注意,您應該使用'pg.Surface((100,100),flags = pg.SRCALPHA)'從最新問題的更新回答中避免需要啓動顯示(顯示非常分散注意力)。 //這可能是因爲你在一個妨礙正確刪除的環境中運行;儘管實際上沒有定義好的行爲,但對我來說,總是覺得「del」是必需的。來自文檔的 – Veedrac