为什么是曲面.解锁无法打开水面进行闪电射击?

2024-06-16 12:30:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将alpha值的numpy数组应用于曲面。我可以这样做,但是在这个操作之后,曲面仍然是锁定的,这样我就无法将曲面blit到我的显示器上。在

下面是一个简单的测试用例,使用alpha数组g,pickledhere。在

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

那么什么给予?无论如何,我尝试将该表面bliting到screen,但是(可以预见的)我得到了一个关于s仍然被锁定的错误。在

建议将是最受欢迎的!在


Tags: thealphanumpy测试用例数组arrayscreen显示器
1条回答
网友
1楼 · 发布于 2024-06-16 12:30:36

创建一个sprite类并将值放入更新函数中。这样,数组将在函数的作用域内创建和销毁。下面是一个示例,您可以通过按空格键使灰色块透明:

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

相关问题 更多 >