pymunk space.remove 方法出错
我有一个小球生成器,它可以“生成”并把小球(圆形)添加到模拟中。
当小球碰到静态的多边形(在列表 s_boxes
中)时,就会被移除。
这个过程是通过一个碰撞处理器 ball_wall_collision
来完成的。
错误信息:
下面这个弹出窗口的作用就是它的名字所说的,弹出来了。
我的代码:
小球生成器
class BallGenerator:
def __init__(self, min_y, max_y, x):
self.min = min_y
self.max = max_y
self.x = x
self.counter = 0
def bowl(self, balls):
global ball_bowled
y = random.randint(self.min, self.max)
pos = to_pymunk((self.x,y))
r = 10
m = 15
i = pm.moment_for_circle(m, 0, r)
b = pm.Body(m,i)
b.position = pos
f_x = random.randint(-600000,-400000)
b.apply_force( (f_x,0.0),(0,0) )
ball = pm.Circle(b, r)
ball.elasticity = 0.75
ball.friction = 0.95
balls.append(ball)
space.add(ball,b)
print 'bowled'
ball_bowled += 1
def handle(self, balls):
if self.counter == FPS:
self.bowl(balls)
self.counter = 0
self.counter += 1
碰撞处理器
def ball_wall_collision(space, arb, balls, s_boxes):
shapes = arb.shapes
boxes = [box[0] for box in s_boxes] # Get walls
ball = None
wall = None
for ba in balls:
if ba in shapes:
ball = ba
break
for box in boxes:
if box in shapes:
wall = box
break
if wall and ball:
print 'removing'
space.remove(ball, ball.body) # Where the runtime problem happens
balls.remove(ball)
print 'removed'
return False
else:
return True
space.add_collision_handler(0,0,begin=ball_wall_collision,
balls=balls,s_boxes=s_boxes) # Other args to function
在碰撞处理上我做错了什么呢??
- 我在调用
space.remove
的时候是不是漏掉了什么? - 这个函数是不是没有按照我想要的方式工作?
还是说错误出在其他地方(我觉得不是)……
1 个回答
2
看起来你遇到的问题是,在模拟步骤中,你试图在碰撞处理器里移除一些物体。
其实你可以试试先把所有的球收集到一个列表里,然后在步骤结束后再调用移除操作,或者像下面这样在步骤结束后再排队移除:
space.add_post_step_callback(space.remove, ball)
space.add_post_step_callback(space.remove, ball.body)
(这段代码还没测试过)
我可能应该在API文档中把这个说明得更清楚一些……我在想,是否可以自动安排移除操作到步骤结束时,或者用一种不那么干扰的方式,在Python中触发一个断言,这样你就不会遇到C++的错误了。