Pymunk添加Segment多边形时报body需提前加入空间错误如何解决
问题根因
Pymunk要求绑定了刚体的形状,必须在添加形状前将对应刚体加入物理空间,或者两者同时添加到空间。你的代码只将Segment形状加入了空间,对应的Static Body没有被添加,因此触发断言报错。
修复方案
方案1:直接修复原有逻辑
如果需要每个Segment对应单独的刚体,在调用space.add时同时传入刚体和形状即可:
class StaticPoly: def __init__(self, space, pos, elasticity=1, collision_type=None): self.bodies = [] self.shapes = [] self.pos = pos for i in list(range(0, len(self.pos) - 1))+[-1]: print(i) self.bodies.append(pymunk.Body(body_type=pymunk.Body.STATIC)) self.shapes.append(pymunk.Segment(self.bodies[i], self.pos[i], self.pos[i + 1], 1)) self.shapes[i].elasticity = elasticity # 同时添加刚体和形状 space.add(self.bodies[i], self.shapes[i]) if collision_type: self.shapes[i].collision_type = collision_type
方案2:优化(推荐)
所有静态Segment不需要单独绑定刚体,共用同一个静态刚体即可,大幅减少不必要的资源占用:
class StaticPoly: def __init__(self, space, pos, elasticity=1, collision_type=None): self.shapes = [] self.pos = pos # 全局共用一个静态刚体 self.body = pymunk.Body(body_type=pymunk.Body.STATIC) for i in list(range(0, len(self.pos) - 1))+[-1]: seg_shape = pymunk.Segment(self.body, self.pos[i], self.pos[i + 1], 1) seg_shape.elasticity = elasticity if collision_type: seg_shape.collision_type = collision_type self.shapes.append(seg_shape) # 一次性添加刚体和所有形状 space.add(self.body, *self.shapes)
额外提示:如果你需要的是实心多边形碰撞体,不需要自己拼接Segment,可以直接使用
pymunk.Poly接口生成实心多边形,代码更简洁,碰撞检测效率也更高。
内容的提问来源于stack exchange,提问作者Sha7r
相关产品推荐
相关产品推荐

