2013-03-07 89 views
1

我有一個球發生器,它「生成」並將球(圓圈)添加到模擬中。pymunk space.remove方法的錯誤

當球在列表s_boxes中擊中一個靜態多邊形時將被移除。
這是由碰撞處理程序ball_wall_collision完成的。

的錯誤:
以下彈出窗口做什麼它的名字一樣,它彈出式
**POP UP WINDOW**

我的代碼:
球發電機

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的電話中缺少什麼嗎?
  • 功能不工作,因爲我想它? 或者是錯誤的其他地方(我不認爲這是)...
+0

並且*錯誤*然後是什麼?請包括完整的追溯。 – 2013-03-07 10:28:38

回答

2

它看起來像問題是,你嘗試在模擬工序,從在衝突處理的空間刪除對象。

相反,你可以嘗試手動收集所有的球到一個列表中,然後調用步驟之後刪除或排隊刪除與後續步驟回調是這樣的:

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

(未經測試的代碼)

我應該嘗試,並在API文檔中使這更明顯..我不知道是否自動調度刪除直到步驟結束,或較少侵入選項是一個好主意,觸發一個斷言在Python中,所以你不要得到c + +錯誤。

+0

好的,我做了這些:我做了一個列表並添加了球(將被刪除)到列表中,並且在該步驟之後,我從列表中刪除了'ball'和'ball.body',並且'space' 。 Thx的幫助.. – pradyunsg 2013-03-08 10:50:50

+0

檢查我的[新問題](http://stackoverflow.com/q/15459943/1931274).. – pradyunsg 2013-03-17 11:05:18

+1

現在有一個代碼,所以你可以打電話刪除任何時間,而不必做任何手動的東西,如post_step_callback或一個單獨的列表。 (所以這將被包含在下一個版本的pymunk中) – viblo 2013-03-18 16:56:11