鱼C论坛

 找回密码
 立即注册
查看: 1118|回复: 2

[已解决]逐渐透明问题

[复制链接]
发表于 2023-12-16 18:31:10 | 显示全部楼层 |阅读模式
20鱼币
最近突发奇想想做一个可以让图像逐渐透明的模块,可是出bug了,想问一下到底是怎么回事,代码如下:
  1. import pygame
  2. import sys

  3. pygame.init()

  4. running = True
  5. size = width, height = 600, 400
  6. screen = pygame.display.set_mode(size)
  7. bmf = pygame.image.load('Chomper.gif').convert_alpha()
  8. p = (300, 200)
  9. bg = pygame.image.load('170731094492.jpg')
  10. bgp = (0, 0)

  11. def blit_alpha(t, t1, s, l, o):
  12.     #print('正在调用函数中...')
  13.     x = l[0]
  14.     y = l[1]
  15.     temp = pygame.Surface((s.get_width(), s.get_height())).convert()
  16.     temp.blit(t1, (-x, -y))
  17.     temp.blit(s, (0, 0))
  18.     temp.set_alpha(o)
  19.     t.blit(temp, l)

  20. def zjxh(t, t1, s, l, n):
  21.     for i in range(1, n):
  22.         #print('执行中... x ', i)
  23.         blit_alpha(t, t1, s, l, i)
  24.         #print(f'此时blit_alpha的参数有{t}, {t1}, {s}, {l}, {i}')

  25. while True:
  26.     for event in pygame.event.get():
  27.         if event.type == pygame.QUIT:
  28.             sys.exit()
  29.         screen.blit(bg, bgp)
  30.         zjxh(screen, bg, bmf, p, 100)
  31.         pygame.display.flip()
  32.         pygame.time.delay(10)
复制代码
bug主要体现在无法透明,请各位看看,谢谢
最佳答案
2023-12-16 18:31:11
你好!你的代码中实现逐渐透明的思路是正确的,但是在代码的执行过程中出现了一些问题。我来帮你解决一下。

首先,问题出在你的循环结构上。目前你的循环是在程序运行的主循环中,这样会导致每一帧都会进行透明度增加的操作,导致图像迅速变得透明了。你可以将透明度增加的操作放在一个独立的循环中,让它单独控制透明度的变化。

其次,你需要注意 blit_alpha 函数中 temp 的大小问题。在这个函数中,你使用了传入的 s 参数的大小来创建 temp,但是 s 参数是你要渐变的原始图像 bmf,而不是背景图像 bg。所以,你需要修改这个地方为 temp = pygame.Surface((t.get_width(), t.get_height())).convert()。

最后,你需要增加一个条件来判断透明度是否已经达到最大值,并且在达到最大值时停止递增。

修改后的代码如下:
  1. import pygame
  2. import sys
  3. pygame.init()
  4. running = True
  5. size = width, height = 600, 400
  6. screen = pygame.display.set_mode(size)
  7. bmf = pygame.image.load('Chomper.gif').convert_alpha()
  8. p = (300, 200)
  9. bg = pygame.image.load('170731094492.jpg')
  10. bgp = (0, 0)
  11. def blit_alpha(t, t1, s, l, o):
  12.     x = l
  13.     y = l
  14.     temp = pygame.Surface((t.get_width(), t.get_height())).convert()
  15.     temp.blit(t1, (-x, -y))
  16.     temp.blit(s, (0, 0))
  17.     temp.set_alpha(o)
  18.     t.blit(temp, l)
  19. def zjxh(t, t1, s, l, n):
  20.     for i in range(1, n):
  21.         blit_alpha(t, t1, s, l, i)
  22.         pygame.display.flip()
  23.         pygame.time.delay(10)
  24. while True:
  25.     for event in pygame.event.get():
  26.         if event.type == pygame.QUIT:
  27.             sys.exit()
  28.    
  29.     screen.blit(bg, bgp)
  30.     zjxh(screen, bg, bmf, p, 255)  # 透明度最大值为 255
复制代码

希望我的回答对你有所帮助,祝你顺利完成逐渐透明的模块!如果还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

最佳答案

查看完整内容

你好!你的代码中实现逐渐透明的思路是正确的,但是在代码的执行过程中出现了一些问题。我来帮你解决一下。 首先,问题出在你的循环结构上。目前你的循环是在程序运行的主循环中,这样会导致每一帧都会进行透明度增加的操作,导致图像迅速变得透明了。你可以将透明度增加的操作放在一个独立的循环中,让它单独控制透明度的变化。 其次,你需要注意 blit_alpha 函数中 temp 的大小问题。在这个函数中,你使用了传入的 s 参数的大 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-12-16 18:31:11 | 显示全部楼层    本楼为最佳答案   
你好!你的代码中实现逐渐透明的思路是正确的,但是在代码的执行过程中出现了一些问题。我来帮你解决一下。

首先,问题出在你的循环结构上。目前你的循环是在程序运行的主循环中,这样会导致每一帧都会进行透明度增加的操作,导致图像迅速变得透明了。你可以将透明度增加的操作放在一个独立的循环中,让它单独控制透明度的变化。

其次,你需要注意 blit_alpha 函数中 temp 的大小问题。在这个函数中,你使用了传入的 s 参数的大小来创建 temp,但是 s 参数是你要渐变的原始图像 bmf,而不是背景图像 bg。所以,你需要修改这个地方为 temp = pygame.Surface((t.get_width(), t.get_height())).convert()。

最后,你需要增加一个条件来判断透明度是否已经达到最大值,并且在达到最大值时停止递增。

修改后的代码如下:
  1. import pygame
  2. import sys
  3. pygame.init()
  4. running = True
  5. size = width, height = 600, 400
  6. screen = pygame.display.set_mode(size)
  7. bmf = pygame.image.load('Chomper.gif').convert_alpha()
  8. p = (300, 200)
  9. bg = pygame.image.load('170731094492.jpg')
  10. bgp = (0, 0)
  11. def blit_alpha(t, t1, s, l, o):
  12.     x = l
  13.     y = l
  14.     temp = pygame.Surface((t.get_width(), t.get_height())).convert()
  15.     temp.blit(t1, (-x, -y))
  16.     temp.blit(s, (0, 0))
  17.     temp.set_alpha(o)
  18.     t.blit(temp, l)
  19. def zjxh(t, t1, s, l, n):
  20.     for i in range(1, n):
  21.         blit_alpha(t, t1, s, l, i)
  22.         pygame.display.flip()
  23.         pygame.time.delay(10)
  24. while True:
  25.     for event in pygame.event.get():
  26.         if event.type == pygame.QUIT:
  27.             sys.exit()
  28.    
  29.     screen.blit(bg, bgp)
  30.     zjxh(screen, bg, bmf, p, 255)  # 透明度最大值为 255
复制代码

希望我的回答对你有所帮助,祝你顺利完成逐渐透明的模块!如果还有其他问题,请随时向我提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-12-16 18:36:24 | 显示全部楼层
把你的文件发上来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 10:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表