我使用pygame的和Python的项目我建设,我很为构建游戏时首先打开一个启动画面。 我有我想要显示溅射屏幕.png文件,并决定从黑色淡入淡出它。 我发现做到这一点的最好办法是用一组阿尔法块传输的图像。 我做了这个代码,但它运行非常缓慢(在程序挂起30秒),并没有给出一个字母。 只显示画面在屏幕上。 我究竟做错了什么?
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
你可能有(除了什么猴子说)的另一个问题是,你可能需要使用surface.convert()
将图像转换为其中阿尔法是可以改变的一种形式。 你可以做以下任一操作。
image = pygame.image.load("logo.png")
image = image.convert()
要么
image = pygame.image.load("logo.png").convert()
我发现,虽然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()
在我testings,图像褪色1在正常,但像2呆在黑暗的全部时间。 你应该自己尝试; 你的电脑可能会有所改变。
如果surface.convert_alpha()
不为你工作,你应该使用它,否则,做什么,我之前说的。 这应该解决您的问题。
你也应该注意,我用pygame.time.delay(20)
而不是像2000你面前了。 如果你是在一个incraments增加阿尔法2000将是一个有点太长了。
[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)
要淡入淡出,你需要不断循环,直到玩家点击/点击一个按钮。 像这样:
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)
PygameNerd您的例子是接近,但它并没有真正发挥作用。
该image.convert()将正常褪色,但它不支持Alpha通道。 尝试在一个非黑色的背景和它显示。 该image.convert_alpha()不会褪色,但alpha通道没有正常工作。
我很惊讶,pygame的不支持此开箱即用,但无论如何。 这里有一个答案: http://www.nerdparadise.com/tech/python/pygame/blitopacity/
它有点复杂,但能正常工作。 透明的背景&衰落在一个包。