2015-04-13 3 views
0

Я пишу игру, где падает камень, и вы используете мышь, чтобы ваш шеф-повар не раздавился. Когда камень падает с экрана, появляются еще две породы. Это продолжается до тех пор, пока ваш персонаж не станет намотанным.Как исправить TypeError: unbound метод должен быть вызван с экземпляром Dropper в качестве первого аргумента

Однако я получил ошибку:

TypeError: unbound method additonal_drop() must be called with Dropper instance as first argument (got nothing instead) 

я не уверен, что я должен положить в (). Может кто-нибудь объяснить мне эту ошибку?

Кроме того, как мне получить спрайт Dropper, чтобы его не было видно?

Вот мой код:

from livewires import games, color 
import random 

games.init(screen_width = 640, screen_height = 480, fps = 50) 


class Chef(games.Sprite): 

    image = games.load_image("chef.bmp") 

    def __init__(self): 
     super(Chef, self).__init__(image = Chef.image, 
            x = games.mouse.x, 
            bottom = games.screen.height) 
    def update(self): 
     """ Move to mouse x position. """ 
     self.x = games.mouse.x 

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

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

     self.check() 

    def check(self): 
     """ Check if hit by rocks. """ 
     for rock in self.overlapping_sprites: 
      rock.end_game() 

class Rock(games.Sprite): 
    """ 
    A rock which falls to the ground. 
    """ 
    image = games.load_image("rock.bmp") 
    speed = 1 

    def __init__(self, x = 320, y = 90): 
     """ Initialize a rock object. """ 
     super(Rock, self).__init__(image = Rock.image, 
            x = x, y = y, 
            dy = Rock.speed) 

    def end_game(self): 
     """ End the game. """ 
     end_message = games.Message(value = "Game Over", 
            size = 90, 
            color = color.red, 
            x = games.screen.width/2, 
            y = games.screen.height/2, 
            lifetime = 2 * games.screen.fps, 
            after_death = games.screen.quit) 
     games.screen.add(end_message) 

    def update(self): 
     """ Check if bottom edge has reached screen bottom. """ 
     if self.bottom > games.screen.height: 
      self.destroy() 
      Dropper.additonal_drop() 


class Dropper(games.Sprite): 
    """ 
    A invisible sprite that drops the rocks. 
    """ 
    image = games.load_image("rock.bmp") 
    def __init__(self, y = 55, speed = 2, odds_change = 200): 
     """ Initialize the dropper object. """ 
     super(Dropper, self).__init__(image = Dropper.image, 
             x = games.screen.width/2, y = y, 
             dx = speed) 

     self.odds_change = odds_change 
     self.time_til_drop = 0 


    def update(self): 
     """ Determine if direction needs to be reversed. """ 
     if self.left < 0 or self.right > games.screen.width: 
      self.dx = -self.dx 
     elif random.randrange(self.odds_change) == 0: 
      self.dx = -self.dx 

    def additonal_drop(self): 
     new_rock = Rock(x = self.x) 
     games.screen.add(new_rock) 

     new_rock = Rock(x = self.x) 
     games.screen.add(new_rock) 


def main(): 
    """ Play the game. """ 
    wall_image = games.load_image("wall.jpg", transparent = False) 
    games.screen.background = wall_image 

    the_chef = Chef() 
    games.screen.add(the_chef) 

    the_rock = Rock() 
    games.screen.add(the_rock) 

    the_dropper = Dropper() 
    games.screen.add(the_dropper) 

    games.mouse.is_visible = False 

    games.screen.event_grab = True 
    games.screen.mainloop() 

# start it up! 
main() 
+0

The' Rock' класс не имеет в 'additional_drop)' метода (. Метод 'Additional_drop()' должен быть вызван в 'Dropper' _instance_, а не в самом классе' Dropper'. – TigerhawkT3

+2

Вы читаете Python Programming для Absolute Beginners, правильно? У этого должен быть полный образец кода, содержащий игру Pizza Pan. –

ответ

1

Попробуйте определения класса Rock с дополнительным параметром dropper:

def __init__(self, x = 320, y = 90, dropper=Dropper()): 

dropper будет Dropper экземпляр. Затем создайте Rock экземпляров изнутри Dropper следующим образом:

Rock(x=self.x, dropper=self) 

Это передаст экземпляр Dropper он self каждых Rock например, что экземпляр Dropper создает. В Rock «ы __init__(), сохранить ссылку на экземпляр Dropper:

self.dropper = dropper 

additional_drop() вызов с:

self.dropper.additional_drop() 
+0

Спасибо! На самом деле у меня наконец появилось прозрение, и мне пришлось работать по-другому, но я также попробовал ваше предложение. Благодарю. – Josh

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

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