Pygame碰撞时绘制半透明图片报错TypeError,求解决方案
解决Pygame碰撞触发半透明图片显示的错误问题
错误根源
你写的pygame.image.load(...).set_alpha(150)是错的——set_alpha()是个只修改原Surface、不返回任何值的方法,所以glitchingimg被赋值成了None,后面调用pygame.transform.scale时自然会抛出类型错误。
修复方案+优化代码
1. 提前加载所有 glitch 图片(避免主循环反复读取文件)
在主游戏循环外部预加载所有 glitch 图片,同时提前完成缩放和透明度设置,提升游戏流畅度:
import pygame import random import os cur_dir = os.path.dirname(__file__) # 预加载5张 glitch 图片,提前处理尺寸和透明度 glitch_image_list = [] for img_num in range(1, 6): # 加载图片并处理透明通道 raw_img = pygame.image.load(f"{cur_dir}/GlitchingImg{img_num}.png").convert_alpha() # 缩放到目标尺寸800x800 scaled_img = pygame.transform.scale(raw_img, (800, 800)) # 设置半透明(150为透明度值,范围0-255,0全透明、255不透明) scaled_img.set_alpha(150) glitch_image_list.append(scaled_img)
2. 用状态变量控制 glitch 显示开关
在主循环外部定义一个布尔变量,标记当前是否需要显示 glitch 效果:
show_glitch = False
3. 改写主循环内的核心逻辑
理顺碰撞判断、状态更新和图片显示的流程,简化玩家跟随矩形的代码:
# 主游戏循环开始 while True: # 先处理事件、更新玩家位置等常规游戏逻辑... # 更新跟随玩家的200x200矩形(直接赋值即可,无需额外判断) square_of_glitchiness = pygame.Rect(playerx - 100, playery - 100, 200, 200) # 用背景色绘制矩形,让玩家无法看到 pygame.draw.rect(world, (bg1, bg2, bg3), square_of_glitchiness) # 碰撞检测,更新glitch状态 if pursrect.colliderect(square_of_glitchiness): show_glitch = True else: show_glitch = False # 若处于glitch状态,随机选一张预加载的图片绘制 if show_glitch: random_glitch = random.choice(glitch_image_list) world.blit(random_glitch, (1, 1)) # 统一刷新整个屏幕(不要将update放在碰撞分支内) pygame.display.update()
额外提醒
convert_alpha()必须添加,否则带透明通道的图片显示会异常;- 预加载图片避免了主循环内频繁的文件IO操作,能显著提升游戏运行流畅度;
- 将
pygame.display.update()放在循环末尾,保证每次循环完整刷新画面,避免局部更新导致的画面错乱。
内容的提问来源于stack exchange,提问作者T3CHN0BL4ST
相关产品推荐
相关产品推荐

