在pyGame中淡入屏幕?

所以我想让我的菜单在游戏开始时淡入淡出。 为此,我创建了第二个表面,并计划用黑色填充,然后逐渐增加alpha。 所以在构造函数中我添加了:

self.fadeInSurface = pygame.display.set_mode(screen_size, flag) 

在游戏循环开始之前的主要游戏方法中:

 self.fadeIn() 

上面提到的fadeIn()看起来像这样:

 def fadeIn(self): for i in range(100): self.fadeInSurface.fill((0,0,0)) self.fadeInSurface.set_alpha(i) self.clock.tick(30) pygame.display.flip() 

但是不是淡入淡出,我只能在短时间内看到纯黑色的屏幕,然后菜单上就没有任何眼神。 我究竟做错了什么?

编辑:感谢@ Heckel,我做了这样的事情:

 def fadeIn(self): for i in range(255): self.surface.blit(self.background, (0,0), None, BLEND_RGB_MAX) self.surface.blit(self.curStart, (100,200), None) self.surface.blit(self.curQuit, (400,350), None) self.fadeInSurface.fill((0,0,0)) self.fadeInSurface.set_alpha(255-i) self.surface.blit(self.fadeInSurface, (0,0)) self.clock.tick(30) pygame.display.flip() 

所以我有我的项目我的button和背景的主表面(称为表面)和一个二级表面(称为fadeInSurface),这是坚实的黑色,但其alpha变化。 然而,运行这个代码,仍然会导致黑屏几秒钟,然后突然改变整个菜单的全部清晰度:(为什么这样?

你需要一个blitflip之前显示你的黑色表面。 纯黑色来自于你没有在屏幕上显示任何东西。 另外,如果你想让你的菜单淡入黑色表面,需要淡出,所以你必须减less它的alpha。

虽然,这仍然不起作用,因为您只在循环中绘制黑色表面,而不是菜单。

我不知道代码的其余部分如何,但是你应该在画完菜单之后画出黑色的表面,全部在一个循环中。 你应该有一个variables来保持你的黑色表面的alpha,并且当alpha是0时你停止显示它。

也许这会帮助你。

非常好的主意,我必须说。 我已经解决了这个问题。 首先,你绝对不需要使用for-loop(这就是事情发生得很快的原因)。

我问你:

游戏已经没有主循环了? 在你的代码中,在游戏的第一帧,你运行一个循环,将所有的颜色值增加到最大值。 所以,这就是问题所在。

我没有使用你的variables,但希望我的例子是可以理解的。 尝试类似的东西:

 from pygame import * DONE = False screen = display.set_mode((1024,768)) alphaSurface = Surface((1024,768)) # The custom-surface of the size of the screen. alphaSurface.fill((255,255,255)) # Fill it with whole white before the main-loop. alphaSurface.set_alpha(0) # Set alpha to 0 before the main-loop. alph = 0 # The increment-variable. while not DONE: screen.fill((0,0,0)) # At each main-loop fill the whole screen with black. alph += 0.1 # Increment alpha by a really small value (To make it slower, try 0.01) alphaSurface.set_alpha(alph) # Set the incremented alpha-value to the custom surface. screen.blit(alphaSurface,(0,0)) # Blit it to the screen-surface (Make them separate) # Trivial pygame stuff. if key.get_pressed()[K_ESCAPE]: DONE = True for ev in event.get(): if ev.type == QUIT: DONE = True display.flip() # Flip the whole screen at each frame. quit() 

您应该能够正确运行此代码。 我希望它有帮助。

相反:

 alphaSurface.set_alpha(255) # Set alpha to 255 before the main-loop. alph = 255 # The Decrement-variable. alph -= 0.1 # Decrement alpha by a really small value (To make it slower, try 0.01)