Pygame中Rect.midleft等属性是否为元组?出现类型报错如何解决
Pygame Rect锚点属性说明与粒子效果报错修复
- 先确认属性类型:Pygame的
Rect对象的midleft、midright、center、topleft这类位置锚点属性,返回值全都是不可变的元组(tuple)类型,本身不支持直接修改内部元素值。
报错原因
你的代码有两个问题直接触发了这个类型错误:
- 存储粒子坐标时多写了一层方括号,结构嵌套错误:你写的
[ship_rect.midleft]会把坐标元组再包进一个列表里,最终ship_particle[0][0]取到的是完整的(x, y)坐标元组,你给元组直接加整数-3,自然触发「元组不能和整数拼接」的报错。 - 就算去掉多余括号,直接存元组类型的坐标,后续你要修改坐标做粒子位移动画的时候,也会因为元组不可变抛错,没法直接改坐标值。
另外你代码里还有个隐藏逻辑bug:过滤失效粒子的代码写在了遍历粒子的循环内部,每处理一个粒子就会重新赋值粒子列表,很容易出现遍历漏项、列表长度变化导致的索引异常。
修复方法
直接改两处代码就行:
- 新增粒子的时候,把元组坐标转成可变的列表,同时去掉多余的嵌套括号:
# 原错误写法:ship_particles.append([[ship_rect.midleft],-3, random.randint(5,6)]) # 改成: ship_particles.append([list(ship_rect.midleft), -3, random.randint(5,6)]) - 把过滤失效粒子的逻辑挪到粒子遍历循环的外面,避免遍历过程中修改原列表:
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
相关产品推荐
相关产品推荐

