Hii
我需要有关pygame的帮助
我在python 3.7.2
64 bits
下
所以我正在努力研究一种退出窗口的平滑方法
我想通过在pygame.SRCALPHA
上使用surface
来创建淡出动画
让我介绍一下问题:it's isn't work at all
:(
for e in pygame.event.get():
if e.type == QUIT:
window = 'left'
run = False
loop = False
c = 0
for i in range(50):
fade('out')
time.sleep(0.05)
pygame.display.update()
pygame.display.quit()
sys.exit()
要完全理解所有这些,我给您其他重要的建议
alpha = pygame.Surface((1920, 1080), pygame.SRCALPHA)
这是表面的创造
def fade(f_type): # must set c at 255 or 1
global c, alpha
c += 1 if f_type == 'out' else -1
alpha.fill((0,0,0,c))
screen.blit(alpha, (0,0))
这是淡入淡出()函数以使淡入淡出
哦,这是我的回溯,我的意思是,出现一条我不知道的错误消息,也许可以帮助您:D
libpng warning: Interlace handling should be turned on when using png_read_image
libpng warning: iCCP: known incorrect sRGB profile <- this line
[Finished in 35.5s]
有人知道问题出在哪里吗? @这里
答案 0 :(得分:0)
我不知道您的衰落有什么问题,因为您已经解释了它,并且我们无法运行您的代码来查看问题。
按下ESC
后,图像会褪色(在Linux Mint 19,Python 3.7,PyGame 1.9.6上有效)
import pygame
pygame.init()
screen = pygame.display.set_mode((800,600))
img = pygame.image.load('image.jpg').convert()
img_rect = img.get_rect()
alpha = pygame.Surface((800, 600), pygame.SRCALPHA)
alpha_rect = alpha.get_rect()
alpha_val = 0
alpha_step = 10
clock = pygame.time.Clock()
running = True
fading = False
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
fading = True
if fading:
alpha.fill((0,0,0,alpha_val))
if alpha_val < 256-alpha_step:
alpha_val += alpha_step
else:
running = False
screen.blit(img, img_rect)
screen.blit(alpha, alpha_rect)
pygame.display.flip()
clock.tick(30)
pygame.quit()
与set_alpha()
相同,但没有pygame.SRCALPHA
。
此方法还可用于从一个图像淡入另一个图像。
import pygame
pygame.init()
screen = pygame.display.set_mode((800,600))
#img = pygame.image.load('image.jpg').convert()
img = pygame.Surface((800, 600))
img.fill((255, 0 , 0))
img_rect = img.get_rect()
alpha = pygame.Surface((800, 600)) # without pygame.SRCALPHA
alpha.set_alpha(0)
alpha_rect = alpha.get_rect()
alpha_val = 0
alpha_step = 10
clock = pygame.time.Clock()
running = True
fading = False
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
fading = True
if fading:
alpha.set_alpha(alpha_val)
if alpha_val < 256-alpha_step:
alpha_val += alpha_step
else:
running = False
screen.blit(img, img_rect)
screen.blit(alpha, alpha_rect)
pygame.display.flip()
clock.tick(30)
pygame.quit()
答案 1 :(得分:0)
通常,您的0
算法可以工作,但是不必增加变量IllegalArgumentException
。注意,显示应该线性地“变暗”,因此从整个表面的颜色中减去一个恒定值就足够了。如果从表面减去255次,则整个表面为黑色。
.fill
可以通过设置fade
参数c
来实现:
special_flags
pygame.BLEND_SUB
请注意,淡入淡出永远不会像这样起作用,因为如果颜色消失了,就不会再出现了。要进行淡入淡出,您必须复制整个表面,将其def fadeout():
screen.fill((1, 1, 1, 1), special_flags = pygame.BLEND_SUB)
循环复制到屏幕上并应用“反向”淡入淡出:
for i in range(255):
fadeout()
# [...]
.blit()
使用pygame.time.delay()
而非def fadein(finalscreen, c):
screen.blit(finalscreen, (0, 0))
screen.fill((c, c, c, c), special_flags = pygame.BLEND_SUB)
来控制淡入时间。时间必须以毫秒为单位设置。 1秒是1000毫秒。由于循环运行255次,因此循环中必须延迟的时间为〜finalscreen = screen.copy()
for i in range(255):
fadein(finalscreen, 255-i)
# [...]
。
与主循环一样,事件也必须在渐变循环中处理。通过pygame.event.poll()
执行此操作:
time.sleep()