You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:44:55