Ошибка атрибута на витой - PullRequest
1 голос
/ 13 августа 2011

Этот вопрос уже дал мне причину, ПОЧЕМУ эта ошибка происходит сейчас, я хочу знать, как решить эту проблему.

Вот код для 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)

вот код для network.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()

Я понятия не имею, как заставить game.spin быть вызванным ПОСЛЕ соединения, чтобы GameClientFactory.connectedProtocol. Я запутался и устал, кто-нибудь может найти лучший способ?

1 Ответ

2 голосов
/ 13 августа 2011

Это похоже на случай, когда ваш вопрос - ваш ответ.Удалите существующий GameEngine код создания экземпляра и замените GameClientFactory на buildProtocol, например:

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

Измените GameEngine.__init__, чтобы просто принять протокол тоже, так как его легче передатьвместо того, чтобы сделать его атрибутом другого объекта, а затем передать этот другой объект.

...