2011-08-12 3 views
1

This question m'a déjà donné la raison pour laquelle cette erreur se produit maintenant, je veux savoir comment résoudre ce problème.Erreur d'attribut sur tordu

Voici le code pour main.py

from twisted.internet import reactor 
import pygame 

from networking import run, construct_factory 

class GameEngine(object): 
    def __init__(self, client): 
     pygame.init() 
     self.screen = pygame.display.set_mode((640, 400)) 
     self.FPS = 60 
     self.client = client.connectedProtocol 
     reactor.callWhenRunning(self.grab_all_sprites) 

    def grab_all_sprites(self): 
     with open('sprites.txt') as sprites: 
      for sprite in sprites: 
       sprite_file = self.client.download_sprite(sprite) 
       with open(r'resources\%s.png' % sprite, 'wb') as out: 
        out.write(sprite_file) 


    def spin(self): 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       reactor.stop() 

      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_SPACE: 
        print "spacebar!" 

     #update the player 
     pygame.display.flip() 
     reactor.callLater((1/self.FPS), self.spin) 

if __name__ in '__main__': 
    client = construct_factory()  
    game = GameEngine(client) 
    run(game, client) 

ici est le code pour networking.py

from twisted.internet import reactor 
from twisted.internet.protocol import ClientFactory 
from twisted.protocols import amp 
import sys 

from ampcommands import TransferSprite 

class GameClient(amp.AMP): 
    def download_sprite(self, sprite): 
     self.callRemote(TransferSprite, sprite) 

class GameClientFactory(ClientFactory): 
    protocol = GameClient 

    def buildProtocol(self, address): 
     proto = ClientFactory.buildProtocol(self, address) 
     self.connectedProtocol = proto 
     return proto 

def construct_factory(): 
    return GameClientFactory() 

def run(game, factory, verbose=True): 

    if verbose: 
     from twisted.python import log 
     log.startLogging(sys.stdout) 

    reactor.connectTCP("localhost", 1234, factory) 
    reactor.callWhenRunning(game.spin) 
    reactor.run() 

Je ne sais pas la moindre façon d'obtenir game.spin être appelée après la la connexion est faite de sorte que GameClientFactory.connectedProtocol. Je suis confus et fatigué quelqu'un peut-il trouver un meilleur moyen?

Répondre

2

Cela semble être un cas où votre question est votre réponse. Retirez votre code GameEngine instanciation existant et changer votre GameClientFactory d'avoir un buildProtocol comme celui-ci:

def buildProtocol(self, address): 
    proto = ClientFactory.buildProtocol(self, address) 
    GameEngine(proto).spin() 
    return proto 

changement GameEngine.__init__ juste accepter le protocole, aussi, car il est plus facile de passer juste au lieu de faire un attribut d'un autre objet, puis passer dans cet autre objet.

+0

Comme toujours une réponse étonnante. –