如何在图片上使用pygame set_alpha()

Ben*_*abe 3 python pygame splash-screen

我正在为我正在构建的项目使用pygame和python,并且我正在为游戏首次打开时构建一个启动画面.我有一个.png,我想为启动画面显示,并决定从黑色淡入淡出.我发现这样做的最好方法是使用一组alpha进行blitting.我制作了这段代码,但它运行得非常慢(程序挂起30秒)并且没有给出alpha.仅在屏幕上显示图片.我究竟做错了什么?

screen = pygame.display.set_mode([1066,600])

#Drawable surface
background = pygame.Surface(screen.get_size())

#Used for converting color maps
background = background.convert()

#Splashscreen

#image fades in
for i in range (225):
    background.fill((0,0,0))
    image = pygame.image.load("logo.png")
    image.set_alpha(i)
    logoimage = screen.blit(image,(0,0))
    pygame.display.flip()

pygame.time.delay(2000)

#image fades out

#goes on to display main menu
Run Code Online (Sandbox Code Playgroud)

Pyg*_*erd 9

您可能遇到的另一个问题(除了猴子所说的)是您可能需要使用surface.convert()哪个将图像转换为可以更改alpha的形式.您可以执行以下任一操作.

image = pygame.image.load("logo.png")
image = image.convert()
Run Code Online (Sandbox Code Playgroud)

要么

image = pygame.image.load("logo.png").convert()
Run Code Online (Sandbox Code Playgroud)

我发现,虽然surface.convert_alpha()应该做同样的事情,但它通常不起作用.试试这个测试代码来检查.

import pygame, sys
pygame.init()
window=pygame.display.set_mode((1500, 800))
background=pygame.Surface((window.get_rect().width, window.get_rect().height))
background.fill((0, 0, 0))
image=pygame.image.load('InsertImageHere.png')
image=image.convert()
image2=pygame.image.load('InsertImage2Here.png')
image2=image2.convert_alpha()
rect=image.get_rect()
rect2=image2.get_rect()
rect2.left=rect.width+1
i=1
while True:
    for event in pygame.event.get():
        if event.type==12:
            pygame.quit()
            sys.exit()
    image.set_alpha(i)
    image2.set_alpha(i)
    window.fill((255, 255, 255))
    window.blit(background, background.get_rect())
    window.blit(image, rect)
    window.blit(image2, rect2)
    pygame.time.delay(20)
    i+=1
    if i==255:
        i=1
    pygame.display.update()
Run Code Online (Sandbox Code Playgroud)

在我的测试中,图像1正常消失,但图像2一直保持黑暗.你应该亲自尝试一下; 您的计算机可能以不同的方

如果surface.convert_alpha()适合你,你应该使用它,否则,做我之前说过的话.这应该可以解决您的问题.

你还应该注意我使用的pygame.time.delay(20)不是你以前的2000.如果你增加一个字母的alpha值,那2000年会有点太长.


nin*_*key 5

[1] 您不想每次迭代都加载图像。因为创建一个新的表面是一个缓慢的操作。[2] 你的循环绘制 225 次,然后在最后一次迭代之后,等待 2000 毫秒。

你要:

image = pygame.image.load("logo.png")

for i in range (225):
    background.fill((0,0,0))    
    image.set_alpha(i)
    screen.blit(image,(0,0))
    pygame.display.flip()
    pygame.time.delay(20)
Run Code Online (Sandbox Code Playgroud)

要淡入淡出,您需要一直循环播放直到玩家点击/点击按钮。像这样:

import pygame
from pygame.locals import *

# ...

def title_loop():
    # title screen main loop    
    image = pygame.image.load("logo.png")
    done = False
    alpha = 0
    alpha_vel = 1

    # fade alpha in-out while waiting    
    while not done:        
        # get key input
        for event in pygame.event.get():
            if event.type == QUIT:
                done = true
            if event.type == KEYDOWN:
                if event.key = K_ESCAPE:
                    done = true

        # draw
        if alpha >= 255 or alpha <= 0:
            alpha_vel *= -1
        alpha += alpha_vel

        background.fill((0,0,0))
        image.set_alpha(i)
        screen.blit(image,(0,0))
        pygame.display.flip()

        pygame.time.delay(20)
Run Code Online (Sandbox Code Playgroud)