pygame淡化为黑色功能

时间:2019-02-26 08:32:31

标签: python-3.x pygame

我正在使用pygame最新版本在python 3中编写游戏。我有一个旨在缓慢淡化屏幕直到完全变黑的功能。为此,应在屏幕上多次擦拭低阿尔法黑色表面。

但是当我测试它时,它只会阻塞游戏,直到循环结束为止。我怀疑black_surface的alpha值有问题。

我已经在论坛上看到了一些有关pygame淡入淡出的问题,但是没有一个人直接在函数中淡入淡出。

代码如下:

def fade_to_black(screen):
    black_surface = Surface((screen.get_width(), screen.get_height()), flags= SRCALPHA)
    color = (255, 255, 255, 1)
    black_surface.fill(color)
    alpha_key = 1
    while alpha_key <= 255:
        screen.blit(black_surface, screen.get_rect())
        display.flip()
        alpha_key = alpha_key + 1
        time.wait(1)

我看过文档和论坛,但找不到任何解决方案。希望这不是我想念的明显问题...谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您创建了一个名为black_surface的表面,但是用白色填充了它。将其填充为黑色(例如(0, 0, 0, 1))并可以使用,但是还有另一个问题:

当您在更改屏幕表面的循环中调用display.flip()时,如果您不让pygame处理事件(例如,通过调用pygame.event.get()),则显示可能实际上不会更新,具体取决于您操作系统。另外,在循环运行时,您无法手动处理事件,例如QUIT事件。因此,当屏幕逐渐变黑时,您将无法退出游戏。

通常,您应该只具有一个主循环,而不能调用pygame.time.sleep之类的阻塞函数,但是当然也有例外。)

以下是基于Sprite的简单示例:

import pygame

class Fade(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.rect = pygame.display.get_surface().get_rect()
        self.image = pygame.Surface(self.rect.size, flags=pygame.SRCALPHA)
        self.alpha = 0
        self.direction = 1

    def update(self, events):
        self.image.fill((0, 0, 0, self.alpha))
        self.alpha += self.direction
        if self.alpha > 255 or self.alpha < 0:
            self.direction *= -1
            self.alpha += self.direction

def main():
    pygame.init()
    screen = pygame.display.set_mode((500, 500))
    sprites = pygame.sprite.Group(Fade())
    clock = pygame.time.Clock()

    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        sprites.update(events)
        screen.fill((30, 30, 30))
        pygame.draw.rect(screen, pygame.Color('dodgerblue'), (100, 100, 100, 100))
        sprites.draw(screen)
        pygame.display.update()
        clock.tick(60)

if __name__ == '__main__':
    main()

enter image description here