2012-09-12 20 views
6

Ben pygame-müşterilerle bükülü sunucu yönetmeye çalışıyorum:Pygame mainloop içindeki Twisted istemcileri?

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor 

class Chat(LineReceiver): 
    def __init__(self, users, players): 
     self.users = users 
     self.name = None 
     self.players = players 

    def connectionMade(self): 
     new = 'player_' + str(len(self.players) + 1) 
     self.players.append(new) 
     self.sendLine(str(self.players,)) 

class ChatFactory(Factory): 
    def __init__(self): 
     self.users = {} #maps instances to clients 
     self.players = [] 

    def buildProtocol(self, addr): 
     return Chat(self.users,self.players) 


reactor.listenTCP(6000, ChatFactory()) 
reactor.run() 

dışarı ile müşteri kodu ile bu sunucu çalıştırıyorum: Burada

class ChatClientProtocol(LineReceiver): 
    def lineReceived(self,line): 
     print (line) 

class ChatClient(ClientFactory): 
    def __init__(self): 
     self.protocol = ChatClientProtocol 

def main(): 
    flag = 0 
    default_screen() 
    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       return 
      elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
       return 
      elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: 
       pos = pygame.mouse.get_pos() 
       # some rect.collidepoint(pos) rest of loop... 

Ve sunucusudur reactor.CallLater() yöntemi ve pygames kodu ve istemci iyi bağlanır. Reaktör yöntemini yanlış mı kullanıyorum yoksa pygames koduyla yapısal olarak yanlış bir şey mi var? Herhangi bir yardım takdir edilecektir.

Bu yüzden, pygames bitindeki döngü, reaktörü tekrar aramak için kırılıp kırılmadığını bilmiyor muyum?

+0

Bir şey çalışmıyor mu? Senin sorunun nerede? – sloth

+0

Daha fazla açıklamak için düzenleyeceğim. – tijko

cevap

8

değil değil twisted kullanırken kendi ana döngü (while ile) yazmalısınız. twisted ana döngü kontrol etmek zorunda ve pygame umurumda değil esnek (onun kendi döngü) gerekmez.

reactor.CallLater()

def main(): 
    flag = 0 
    default_screen() 
    reactor.callLater(0.1, tick) 

def tick(): 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      reactor.stop() # just stop somehow 
     elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
      reactor.stop() # just stop somehow 
     elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: 
      pos = pygame.mouse.get_pos() 
      # some stuff 
    reactor.callLater(0.1, tick) 

Bu şekilde arayarak

Bir fonksiyonun içine ana döngü içinde olan her şeyi koymak ve bükülmüş reaktörün ile shedule gerekirdi, reaktör yayınlanmasını sağlamanın ve ağ olaylarını işleyebilir.


İşte sadece alınan son satırı oluşturacak bir müşterinin küçük çalışma örnek: Glyph önerildiği gibi burada


from twisted.internet import reactor 
from twisted.internet.protocol import ClientFactory 
from twisted.protocols.basic import LineReceiver 

import pygame 

class ChatClientProtocol(LineReceiver): 

    def __init__(self, recv): 
     self.recv = recv 

    def lineReceived(self,line): 
     self.recv(line) 

class ChatClient(ClientFactory): 
    def __init__(self, recv): 
     self.protocol = ChatClientProtocol 
     self.recv = recv 

    def buildProtocol(self, addr): 
     return ChatClientProtocol(self.recv) 

class Client(object): 

    def __init__(self): 
     self.line = 'no message' 
     pygame.init() 
     self.screen = pygame.display.set_mode((200, 200)) 
     reactor.callLater(0.1, self.tick) 

    def new_line(self, line): 
     self.line = line 

    def tick(self): 
     self.screen.fill((0,0,0)) 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       reactor.stop() # just stop somehow 
      elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
       reactor.stop() # just stop somehow 
     self.screen.blit(pygame.font.SysFont('mono', 12, bold=True).render(self.line, True, (0, 255, 0)), (20,20)) 
     pygame.display.flip() 
     reactor.callLater(0.1, self.tick) 

if __name__ == '__main__': 
    c = Client() 
    reactor.connectTCP('127.0.0.1',6000, ChatClient(c.new_line))  
    reactor.run() 
LoopingCall kullanarak basit bir örnek, (ı Protokollerine dışarı bıraktı/Yukarıdaki gibi aynı fabrika sınıfları:

from twisted.internet.task import LoopingCall 

class Client(object): 

    def __init__(self): 
     self.line = 'no message' 
     pygame.init() 
     self.screen = pygame.display.set_mode((200, 200)) 

    def new_line(self, line): 
     self.line = line 

    def tick(self): 
     self.screen.fill((0,0,0)) 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       reactor.stop() # just stop somehow 
      elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
       reactor.stop() # just stop somehow 
     self.screen.blit(pygame.font.SysFont('mono', 12, bold=True).render(self.line, True, (0, 255, 0)), (20,20)) 
     pygame.display.flip() 

if __name__ == '__main__': 
    c = Client() 

    lc = LoopingCall(c.tick) 
    lc.start(0.1) 
    reactor.connectTCP('127.0.0.1',6000, ChatClient(c.new_line))  
    reactor.run() 
+0

"reaktör.run()" seçeneğini kene ve ana mesajdan sonra mı çağırmalıyım? Başlamak için ihtiyacım olduğunu düşündüm ya da bu ana ve engelleri sürekli engelleyecek mi? Çünkü onunla birlikte pygame ekranı açılır ve onunla birlikte pygame ekranı hiç açılmaz (böylece ana çağrılmıyor) – tijko

+1

Sadece “main()' işlevini çağırın. müşterin). Önemli olan 'reactor.callLater (0.1, tick)' 'reactor.run()' çağrısından önce çağrılır. – sloth

+0

Hala 'main()' çağrısından sonra 'reactor.ConnectTcp (' 192.168.1.2 ', 6000, ChatClient()) 've' reactor.run' çalıştırmam gerekiyor mu? İleri gittim ve bunu denedim ama şimdi, pygames etkinlikleri cevap vermiyor mu? – tijko