我正在使用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)
我看过文档和论坛,但找不到任何解决方案。希望这不是我想念的明显问题...谢谢您的帮助!
答案 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()