2013-10-09 91 views
0

我在遊戲中使用Livewires和pygame以及其中一個對象會讓您多餘的生命被誤認爲是小行星物體,當額外的生命物體與玩家碰撞時,它會返回'Extra生命對象沒有屬性handle_caught'的錯誤信息,所以我可以請一些幫助。對象行爲不正確

class Extralives(games.Sprite): 
global lives 

image = games.load_image('lives.png', transparent = True) 
speed = 2 

def __init__(self,x,y = 10): 
    """ Initialize a asteroid object. """ 
    super(Extralives, self).__init__(image = Extralives.image, 
           x = x, y = y, 
           dy = Extralives.speed) 
def update(self): 
    """ Check if bottom edge has reached screen bottom. """ 
    if self.bottom>games.screen.height: 
     self.destroy() 

    self.add_extralives 

def add_extralives(self): 
    lives+=1 

小行星類:玩家級的

class Asteroid(games.Sprite): 
global lives 
global score 
""" 
A asteroid which falls through space. 
""" 

image = games.load_image("asteroid_med.bmp") 
speed = 1.7 

def __init__(self, x,image, y = 10): 
    """ Initialize a asteroid object. """ 
    super(Asteroid, self).__init__(image = image, 
           x = x, y = y, 
           dy = Asteroid.speed) 


def update(self): 
    """ Check if bottom edge has reached screen bottom. """ 
    if self.bottom>games.screen.height: 
     self.destroy() 
     score.value+=10 

def handle_caught(self): 
    if lives.value>0: 
     lives.value-=1 
     self.destroy_asteroid() 

    if lives.value <= 0: 
     self.destroy_asteroid() 
     self.end_game() 


def destroy_asteroid(self): 
    self.destroy() 

一部分處理衝突:

def update(self): 
    """ uses A and D keys to move the ship """ 
    if games.keyboard.is_pressed(games.K_a): 
     self.x-=4 
    if games.keyboard.is_pressed(games.K_d): 
     self.x+=4 

    if self.left < 0: 
     self.left = 0 

    if self.right > games.screen.width: 
     self.right = games.screen.width 

    self.check_collison() 

def ship_destroy(self): 
    self.destroy() 

def check_collison(self): 
    """ Check if catch pizzas. """ 
    global lives 
    for asteroid in self.overlapping_sprites: 
     asteroid.handle_caught() 
     if lives.value <=0: 
      self.ship_destroy() 

    for extralives in self.overlapping_sprites: 
     extralives.add_extralives() 

回答

0

這裏是你的問題:

for asteroid in self.overlapping_sprites: 
    asteroid.handle_caught() 
    if lives.value <=0: 
     self.ship_destroy() 

事實上,你致電你的循環變量asteroid並不意味着它神奇地只會成爲一個小行星。不,如果你有其他種類的物體可以碰撞! overlapping_sprites都是重疊的精靈,不只是小行星。在某個點asteroid是一個ExtraLives對象。當您嘗試呼叫handle_caught()時,這顯然會失敗,因爲ExtraLives沒有handle_caught()方法。

這裏最簡單的解決方案是在ExtraLives類中將add_extralives更改爲handle_caught。畢竟,你也在做同樣的事情:處理碰撞(或「捕捉」)對象的情況,它只是一種不同類型的對象,所以結果需要不同,通過提供不同的代碼來指定。能夠通過調用相同的方法來實現完全不同類型的行爲(稱爲「多態性」)是面向對象編程的關鍵。

下面的循環也有類似的問題,在你打電話的對象可能不是ExtraLives類型的add_extralives()。幸運的是,您可以刪除此代碼,因爲您已通過將add_extralives重命名爲handle_caught來處理這種情況。

for extralives in self.overlapping_sprites: 
    extralives.add_extralives() 
+0

非常感謝你:) –

+0

但現在生活中不斷增加,就像他們不只是在Extralife對象與船重疊時添加的那樣? –

+0

沒關係我想通了,但是謝謝非常詳細的解釋,它真的有幫助 –