Error using pymunk space.remove method

I have a ball generator that “generates” and adds balls (circles) to the simulation.

The ball must be removed when it hits the static poly in the s_boxes list.
This is done by the collision handler ball_wall_collision .

Mistake:
The next popup does what it says, it pops up
** POP UP WINDOW **

My code is:
Ball Generator

 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 

Collision handler

 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 

What am I doing wrong in collision handling?

  • Am I missing something in a call to space.remove ?
  • Does the function I need work? Or a mistake elsewhere (which I don’t think so) ...
+1
python pygame pymunk
Mar 07 '13 at 10:23
source share
1 answer

It seems like the problem is that you are trying to remove objects from space in the collision handler during the modeling step.

Instead, you can try to manually collect all the balls in a list, and then call delete after the step, or the queue in the queue deletes with a callback after that:

 space.add_post_step_callback(space.remove, ball) space.add_post_step_callback(space.remove, ball.body) 

(unverified code)

I probably should try and make this more obvious in the API docs. Interestingly, it would be nice to automatically schedule removal to the end of a step or less intrusive parameter, run assert in python so you dont get a C ++ error.

+2
Mar 08 '13 at 10:38
source share



All Articles