2011-10-11 113 views
0

過去一週,我一直在爲一堂課製作炮彈遊戲。我們目前的迭代是添加目標和碰撞檢測。從我的理解pygame.draw函數返回Rect對象。我將這些對象追加到列表中,並將這個列表傳遞給我的炮彈。炮彈然後使用該列表來檢測它是否擊中任何東西。但是,我收到「如果self.current_ball.Rect.collidelist(self.collision_objects)> -1: AttributeError:'NoneType'對象沒有屬性'Rect'」錯誤。pygame炮彈的碰撞檢測

def draw(self, screen): 
     ''' 
     Draws the cannonball 
     '''  
     self.current_ball = pygame.draw.circle(screen, color["red"],(round(self._x),round(self._y)), 5) 
     return self.current_ball 

    def move(self): 
     ''' 
     Initiates the cannonball to move along its 
     firing arc 
     ''' 
     while self.active: 
      prev_y_v = self.y_v 
      self.y_v = self.y_v - (9.8 * self.time_passed_seconds) 
      self._y = (self._y - (self.time_passed_seconds * ((prev_y_v + self.y_v)/2))) 
      self._y = max(self._y, 0) 
      self._x += (self.delta_x) 
      #self.active = (self._y > 0) 
      self.collision_detect() 
      if self.collide == True: 
       self.active = False 

    def collision_detect(self): 
     ''' 
     Detects if the current cannonball has collided with any object within the 
     collision_objects list. 
     ''' 
     if self.current_ball.Rect.collidelist(self.collision_objects) > -1: 
      self.collide = True 

我不能肯定是否有什麼不對的代碼,或者是它實際上與collision_objects列表中的問題?

回答

0

Rect對象沒有Rect屬性。嘗試刪除.Rect屬性,如下所示:

def collision_detect(self): 
    ''' 
    Detects if the current cannonball has collided with any object within the 
    collision_objects list. 
    ''' 
    if self.current_ball.collidelist(self.collision_objects) > -1: 
     self.collide = True 

這裏可能存在多個問題。據我所見,self.current_ball應該是一個Rect對象,並且在您發佈的代碼中沒有任何內容表明它收到「無」。

如果上述更正不起作用,您可能需要檢查其餘類代碼以檢查是否正確調用了self.draw()函數。

+0

我已經嘗試刪除Rect之後意識到「爲什麼我要調用Rect,如果它的Rect對象?」不幸的是它仍然給我同樣的錯誤。在GUI中,我將繪製的對象存儲爲cannonball_object,並且在繪製後與目標相同。我試圖只使用兩個對象而不是一個列表(提前思考)並使用colliderect。老實說,我受這個困擾。 –

+0

我找到了錯誤的原因。在collision_detection嘗試運行後,我的對象被存儲了。直接設置訂單,程序正常運行。 –