pygame;表面上的Alpha妊娠问题

时间:2019-07-12 17:15:49

标签: python pygame alpha pygame-surface

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]
  
    

有人知道问题出在哪里吗? @这里

  

2 个答案:

答案 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()