Search code examples
pygameobserver-pattern

pygame - observer pattern error


I'm testing out using the observer pattern in a game I'm making. However I'm having some problems with it. My code as well as the error is below, can someone help?

the error:

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)

level file:

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

Entity file:

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!"

observable file:

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

Solution

  • class WorldController(Observable):
        def __init__(self):
            super(Observable, self).__init__()
            self._observers = []
    
        def update(self):
            self.addObserver(Player)
            self.notifyObservers()
    

    should be:

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

    otherwise when you call Player.update(self) you are calling a static method instead of a instance method for Player class