|
20鱼币
最近突发奇想想做一个可以让图像逐渐透明的模块,可是出bug了,想问一下到底是怎么回事,代码如下:import pygame
import sys
pygame.init()
running = True
size = width, height = 600, 400
screen = pygame.display.set_mode(size)
bmf = pygame.image.load('Chomper.gif').convert_alpha()
p = (300, 200)
bg = pygame.image.load('170731094492.jpg')
bgp = (0, 0)
def blit_alpha(t, t1, s, l, o):
#print('正在调用函数中...')
x = l[0]
y = l[1]
temp = pygame.Surface((s.get_width(), s.get_height())).convert()
temp.blit(t1, (-x, -y))
temp.blit(s, (0, 0))
temp.set_alpha(o)
t.blit(temp, l)
def zjxh(t, t1, s, l, n):
for i in range(1, n):
#print('执行中... x ', i)
blit_alpha(t, t1, s, l, i)
#print(f'此时blit_alpha的参数有{t}, {t1}, {s}, {l}, {i}')
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.blit(bg, bgp)
zjxh(screen, bg, bmf, p, 100)
pygame.display.flip()
pygame.time.delay(10)
bug主要体现在无法透明,请各位看看,谢谢
你好!你的代码中实现逐渐透明的思路是正确的,但是在代码的执行过程中出现了一些问题。我来帮你解决一下。
首先,问题出在你的循环结构上。目前你的循环是在程序运行的主循环中,这样会导致每一帧都会进行透明度增加的操作,导致图像迅速变得透明了。你可以将透明度增加的操作放在一个独立的循环中,让它单独控制透明度的变化。
其次,你需要注意 blit_alpha 函数中 temp 的大小问题。在这个函数中,你使用了传入的 s 参数的大小来创建 temp,但是 s 参数是你要渐变的原始图像 bmf,而不是背景图像 bg。所以,你需要修改这个地方为 temp = pygame.Surface((t.get_width(), t.get_height())).convert()。
最后,你需要增加一个条件来判断透明度是否已经达到最大值,并且在达到最大值时停止递增。
修改后的代码如下: import pygameimport syspygame.init()running = Truesize = width, height = 600, 400screen = pygame.display.set_mode(size)bmf = pygame.image.load('Chomper.gif').convert_alpha()p = (300, 200)bg = pygame.image.load('170731094492.jpg')bgp = (0, 0)def blit_alpha(t, t1, s, l, o): x = l y = l temp = pygame.Surface((t.get_width(), t.get_height())).convert() temp.blit(t1, (-x, -y)) temp.blit(s, (0, 0)) temp.set_alpha(o) t.blit(temp, l)def zjxh(t, t1, s, l, n): for i in range(1, n): blit_alpha(t, t1, s, l, i) pygame.display.flip() pygame.time.delay(10)while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.blit(bg, bgp) zjxh(screen, bg, bmf, p, 255) # 透明度最大值为 255
希望我的回答对你有所帮助,祝你顺利完成逐渐透明的模块!如果还有其他问题,请随时向我提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
最佳答案
查看完整内容
你好!你的代码中实现逐渐透明的思路是正确的,但是在代码的执行过程中出现了一些问题。我来帮你解决一下。
首先,问题出在你的循环结构上。目前你的循环是在程序运行的主循环中,这样会导致每一帧都会进行透明度增加的操作,导致图像迅速变得透明了。你可以将透明度增加的操作放在一个独立的循环中,让它单独控制透明度的变化。
其次,你需要注意 blit_alpha 函数中 temp 的大小问题。在这个函数中,你使用了传入的 s 参数的大 ...
|