如何淡入淡出图像

时间:2021-05-26 03:56:46

标签: python pygame

所以我一直在尝试淡入淡出图像。我找到了这个教程,我准确地复制了代码并将图像更改为我的图像,但出现错误;

File "C:\Users\Me\Documents\Fan game\Start-Up.py", line 114, in <module>
    main(screen)
  File "C:\Users\Me\Documents\Fan game\Start-Up.py", line 91, in main
    fade = CrossFade(screen)
  File "C:\Users\Me\AppData\Local\Programs\Python\Python39\lib\site-packages\pygame\sprite.py", line 115, in __init__
    self.add(*groups)
  File "C:\Users\Me\AppData\Local\Programs\Python\Python39\lib\site-packages\pygame\sprite.py", line 133, in add
    self.add(*group)
TypeError: pygame.sprite.Sprite.add() argument after * must be an iterable, not pygame.Surface

我不知道这些错误是什么意思。

这是我的代码;

import pygame
pygame.init()

screen = pygame.display.set_mode((640, 480))

class CrossFade(pygame.sprite.Sprite):
    """Synthesizes fade by incrementing the transparency
        of a black surface blitted on top of screen"""
    def _init_(self, screen):
        pygame.sprite.Sprite._init_(self)
        
        #Make a surface to be used as our fader
        #The size is dynamically based on size of the screen
        self.image = pygame.surface(screen.get_size())
        self.image = self.image.convert()
        self.image.fill((0, 0, 0))
        
        #Get the Rect dimensions
        self.rect = self.image.get_rect()
        
        #fade_dir determines whether to fade in or fade out
        self.fade_dir = 1
        
        #trans_value is the degree of transparency
        #225 is opaque/0 is fully transparent
        self.trans_value = 255
        
        #fade_speed is the difference in transparency after each delay
        self.fade_speed = 6
        
        #Delay helps to dynamically adjust the number of frames between fades
        self.delay = 1
        
        #Increment increases each frame (each call to update)
        #until it is equal to our delay (see update() below)
        self.increment = 0
        
        #Initialize our transparency (at opaque)
        self.image.set_alpha(self.trans_value)
        
        #Set position of black surface
        self.rect.centerx = 320
        self.rect.centery = 240
        
    def update(self):
        self.image.set_alpha(self.trans_value)
        #Increase increment
        self.increment += 1
        
        if self.increment >= self.delay:
            self.increment = 0
            
            #Fade in
            if self.fade_dir > 0:
                #Make sure the transparent value doesn't go negative
                if self.trans_value - self.fade_speed < 0:
                    self.trans_value = 0
                #Increase transparency of the black surface by decreasing its alpha
                else:
                    self.trans_value -= self.fade_speed
            
            #Fade out
            elif self.fade_dir < 0:
                #Make sure transparency value doesn't go above 225
                if self.trans_value + self.delay > 225:
                    self.trans_value = 225
                #Increase opacity of black surface
                else:
                    self.trans_value += self.fade_speed
    
def main(screen):
    pygame.display.set_caption("Start-Up")
        
    clock = pygame.time.Clock()
    keepPlaying = True
        
    #Image you'd like to fade over
    logo = pygame.image.load("office.png")
        
    screen.blit(logo, (0, 0))
        
    #CrossFade must be in a sprite group so we can use the .clear() method
    #of sprite updating
    fade = CrossFade(screen)
    all_Sprites = pygame.sprite.Group(fade)
        
    while keepPlaying:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                keepPlaying = False
                
        #Reset the fade after a time-controlled delay
        if fade.trans_value == 0:
            pygame.time.delay(1500)
            fade.fade_dir *= -1
            
        #C.U.D. Sprite Group Dirty Blitting
        all_Sprite.clear(screen, logo)
        all_Sprite.update()
        all_Sprites.draw(screen)
            
        #Refresh the screen
        pygame.display.flip()
            
#MAIN
main(screen)
pygame.quit()

我不知道出了什么问题,如果您有更好/替代的方法来做到这一点,请告诉我

1 个答案:

答案 0 :(得分:0)

我想出了一个更好的方法来做到这一点:D

import pygame
import time

pygame.init()

display_size = pygame.display.Info().current_w , pygame.display.Info().current_h - 50
screen = pygame.display.set_mode(display_size)
image = pygame.image.load(r'textures\logo.png')
image_size = image.get_rect().size

centered_image = [(display_size[0] - image_size[0])/2, (display_size[1] - image_size[1])/2]

time.sleep(1)

for i in range (255):
    screen.fill((0,0,0))    
    image.set_alpha(i)    
    screen.blit(image, centered_image)    
    pygame.display.update()    
    time.sleep(0.001)

time.sleep(1.5)

for i in range (255, 0, -1):
    screen.fill((0,0,0))       
    image.set_alpha(i)    
    screen.blit(image, centered_image)    
    pygame.display.update()    
    time.sleep(0.001)
相关问题