Pygame set_alpha 不适用于尝试背景淡入淡出

问题描述

我一直在尝试创建一个简短的代码,用于一个可以淡入和淡出黑色的项目,但由于某种原因,只有淡入功能在工作,而淡出功能或多或少被跳过。通过给他们参数,我确认问题出在第二个函数中,并且透明度根本没有改变。这是我的代码-

import pygame
screen = pygame.display.set_mode((800,600))
image = pygame.image.load_extended('Map.png').convert_alpha()
image = pygame.transform.scale(image,(530,300))
image.set_alpha(0)
x = 0
y = 255
def fade_in(x):
  while True:
    screen.blit(image,(0,0))
    pygame.display.update()
    image.set_alpha(x)
    pygame.time.delay(100)
    if x < 255:
      x += 5
    else:
      pygame.time.delay(500)
      x = 0
      fade_out(y)
def fade_out(y):
  while True:
    screen.blit(image,0))
    pygame.display.update()
    image.set_alpha(y)
    pygame.time.delay(100)
    if y > 0:
      y -= 5
    else:
      pygame.time.delay(500)
      y = 255
      fade_in(x)
while True:
  fade_in(x)

有人知道问题可能出在哪里吗?

解决方法

当您在屏幕上绘制透明表面时,该表面会与屏幕的当前内容混合。因此,您需要在使用 screen.fill(0) 绘制渐变背景之前清除屏幕。


不要试图以递归方式或在应用程序循环中使用循环来控制应用程序。不要delay游戏。 delay 导致游戏停止响应。

使用应用程序循环并使用 pygame.time.Clock 控制每秒帧数,从而控制游戏速度。

tick() 对象的方法 pygame.time.Clock 以这种方式延迟游戏,即循环的每次迭代消耗相同的时间段。见pygame.time.Clock.tick()

这个方法应该每帧调用一次。

这意味着循环:

clock = pygame.time.Clock()
run = True
while run:
   clock.tick(60)

示例:

import pygame

pygame.init()
screen = pygame.display.set_mode((400,300))
clock = pygame.time.Clock()

try:
    image = pygame.image.load_extended('Map.png').convert_alpha()
    image = pygame.transform.scale(image,(530,300))
except:
    image = pygame.Surface(screen.get_size())
    pygame.draw.circle(image,(255,0),screen.get_rect().center,min(*screen.get_size()) // 2 - 20)

alpha = 0
alpha_change = 1

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False          

    alpha += alpha_change
    if not 0 <= alpha <= 255:
        alpha_change *= -1
    alpha = max(0,min(alpha,255))   

    screen.fill(0)

    alpha_image = image.copy()
    alpha_image.set_alpha(alpha)    
    screen.blit(alpha_image,(0,0))
    
    pygame.display.flip()

pygame.quit()
exit()