2013-03-02 3 views
0

Я тестирую с использованием шаблона наблюдателя в игре, которую я делаю. Однако у меня проблемы с этим. Мой код, а также ошибка ниже, может кто-то помочь?pygame - ошибка шаблона наблюдателя

ошибка: файл

File "C:\Users\Administrator\PycharmProjects\untitled\Level.py", line 112, in update 
    w.update() 
    File "C:\Users\Administrator\PycharmProjects\untitled\Entity.py", line 13, in update 
    self.notifyObservers() 
    File "C:\Users\Administrator\PycharmProjects\untitled\Observable.py", line 15, in notifyObservers 
    observer.update(self) 
TypeError: unbound method update() must be called with Player instance as first argument (got WorldController instance instead) 

уровень:

self.world = [WorldController()] 
for w in self.world: 
      w.update() 

Entity файл:

class WorldController(Observable): 
    def __init__(self): 
     super(Observable, self).__init__() 
     self._observers = [] 

    def update(self): 
     self.addObserver(Player) 
     self.notifyObservers() 

class Entity(Observer, pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 

class Player(Entity, Observer): 
    def __init__(self, x, y): 
     super(Observer, self).__init__() 
     Entity.__init__(self) 
    def update(self, observable): 
     print "works!" 

наблюдаемый файл:

class Observable(object): 
    def __init__(self, **kwds): 
     super(Observable, self).__init__(**kwds) 
     self._observers = [] 
    def addObserver(self, observer): 
     if not observer in self._observers: 
      self._observers.append(observer) 
    def removeObserver(self, observer): 
     try: 
      self._observers.remove(observer) 
     except ValueError: 
      pass 
    def notifyObservers(self): 
     for observer in self._observers: 
      observer.update(self) 

class Observer(object): 
    def __init__(self, **kwds): 
     super(Observer, self).__init__(**kwds) 
    def update(self, observable): 
     pass 

ответ

1
class WorldController(Observable): 
    def __init__(self): 
     super(Observable, self).__init__() 
     self._observers = [] 

    def update(self): 
     self.addObserver(Player) 
     self.notifyObservers() 

должен быть:

class WorldController(Observable): 
    def __init__(self): 
     super(Observable, self).__init__() 
     self._observers = [] 

    def update(self): 
     self.addObserver(Player()) 
     self.notifyObservers() 

в противном случае при вызове Player.update (сам) вы вызываете статический метод вместо метода экземпляра для класса игрока

+0

Я получил это прямо перед ответом, но спасибо, что это была проблема, я сделал немного по-другому, хотя – user1758231

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