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

Pygame中Rect.midleft等属性是否为元组?出现类型报错如何解决

Pygame Rect锚点属性说明与粒子效果报错修复
  • 先确认属性类型:Pygame的Rect对象的midleft、midright、center、topleft这类位置锚点属性,返回值全都是不可变的元组(tuple)类型,本身不支持直接修改内部元素值。

报错原因

你的代码有两个问题直接触发了这个类型错误:

  1. 存储粒子坐标时多写了一层方括号,结构嵌套错误:你写的[ship_rect.midleft]会把坐标元组再包进一个列表里,最终ship_particle[0][0]取到的是完整的(x, y)坐标元组,你给元组直接加整数-3,自然触发「元组不能和整数拼接」的报错。
  2. 就算去掉多余括号,直接存元组类型的坐标,后续你要修改坐标做粒子位移动画的时候,也会因为元组不可变抛错,没法直接改坐标值。

另外你代码里还有个隐藏逻辑bug:过滤失效粒子的代码写在了遍历粒子的循环内部,每处理一个粒子就会重新赋值粒子列表,很容易出现遍历漏项、列表长度变化导致的索引异常。

修复方法

直接改两处代码就行:

  1. 新增粒子的时候,把元组坐标转成可变的列表,同时去掉多余的嵌套括号:
    # 原错误写法:ship_particles.append([[ship_rect.midleft],-3, random.randint(5,6)])
    # 改成:
    ship_particles.append([list(ship_rect.midleft), -3, random.randint(5,6)])
    
  2. 把过滤失效粒子的逻辑挪到粒子遍历循环的外面,避免遍历过程中修改原列表:
    while True:
        # ... 你的其他游戏逻辑
        ship_particles.append([list(ship_rect.midleft), -3, random.randint(5,6)])
        for ship_particle in ship_particles:
            ship_particle[0][0] += ship_particle[1]
            ship_particle[2] -= 0.1
            pygame.draw.circle(screen,(255,255,255),ship_particle[0],ship_particle[2])
        # 所有粒子更新、绘制完再统一过滤掉半径小于等于0的失效粒子
        ship_particles = [p for p in ship_particles if p[2] > 0]
    

改完之后粒子就能正常从飞船midleft位置生成,向左移动模拟引擎喷射效果了。

内容的提问来源于stack exchange,提问作者no DHC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:45:51