2013-10-09 3 views
0

Я использую Livewires и pygame, и один из моих объектов в игре, который дает вам дополнительные жизни, ошибочно воспринимается как объект астероидов, а когда дополнительные объекты жизни сталкиваются с игроком, он возвращает «Экстра» объект жизни не имеет атрибута 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() 

Тот факт, что вы call Ваша переменная цикла asteroid не означает, что это магически только когда-либо будет астероидом. Нет, если у вас есть другие объекты, с которыми вы можете столкнуться! overlapping_sprites - все перекрывающиеся спрайты, а не только астероиды. В какой-то момент asteroid является объектом ExtraLives. Когда вы пытаетесь вызвать handle_caught() на нем, это, очевидно, не получается, потому что ExtraLives не имеет метода handle_caught().

Самое простое решение здесь переименовать add_extralives в handle_caught на ваш класс ExtraLives. В конце концов, вы делаете то же самое: обрабатываете ситуацию, когда вы сталкиваетесь с (или «поймаете») объект, это просто другой тип объекта, поэтому результат должен быть другим, который вы указываете, предоставляя другой код. Возможность реализовать совершенно разные виды поведения путем вызова одних и тех же методов (так называемый «полиморфизм») является любопытной целью объектно-ориентированного программирования.

Следующий цикл имеет аналогичную проблему, поскольку вы вызываете add_extralives() на объекты, которые могут быть не типа ExtraLives. К счастью, вы можете удалить этот код, так как вы уже обрабатываете эту ситуацию, переименовав add_extralives в handle_caught.

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

Спасибо большое :) –

+0

Но теперь жизнь постоянно добавляя, что они не просто добавить, когда объект Extralife пересекается с кораблем? –

+0

Nevermind Я понял это, но да, спасибо за очень подробное объяснение, это действительно помогло –

Смежные вопросы