2012-09-12 27 views
6

Tôi đang cố gắng để chạy một xoắn-server với pygame-khách hàng:Khách hàng được xoắn trong vòng mainlock?

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... 

Và đây là server:

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() 

Tôi đang chạy máy chủ này với mã khách hàng với các Phương thức reactor.CallLater() và mã pygames và client kết nối tốt. Tôi có sử dụng phương pháp lò phản ứng sai hoặc có điều gì đó có cấu trúc sai với mã pygames không? Bất kỳ trợ giúp sẽ được đánh giá cao.

Vì vậy, tôi không biết liệu vòng lặp bên trong bit pygames có bị vỡ để gọi lò phản ứng nữa không?

+0

Có điều gì đó không hoạt động không? Vấn đề của bạn ở đâu? – sloth

+0

Tôi sẽ chỉnh sửa để giải thích chi tiết hơn. – tijko

Trả lời

8

Bạn nên không viết vòng lặp chính của riêng bạn (với while) khi sử dụng xoắn. xoắn có để kiểm soát vòng lặp chính, và pygame là đủ linh hoạt để không quan tâm (nó không cần riêng của mình vòng lặp).

Bạn nên đặt tất cả mọi thứ mà là bên trong vòng lặp chính của bạn thành một chức năng, và shedule nó với các lò phản ứng xoắn bằng cách gọi 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) 

Bằng cách này, bạn đảm bảo chạy lò phản ứng và có thể xử lý các sự kiện mạng.


Dưới đây là một ví dụ làm việc nhỏ của một khách hàng mà chỉ sẽ làm cho dòng cuối cùng nhận được:

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() 

Dưới đây là một ví dụ đơn giản sử dụng LoopingCall, như Glyph gợi ý (tôi rời ra protocoll/các lớp nhà máy giống như ở trên):

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

Tôi có nên gọi 'reactor.run() 'sau khi đánh dấu và chọn chính không? Tôi nghĩ rằng tôi cần thiết để bắt đầu nó hoặc điều này sẽ ngăn chặn chính và đánh dấu từ bao giờ chạy? Bởi vì với nó ra màn hình pygame bắt đầu sau đó thoát ra và với nó màn hình pygame không đi lên ở tất cả (vì vậy chính không được gọi là) – tijko

+1

Chỉ cần gọi 'main()' một lần (hoặc bất cứ mã nào bạn gọi để khởi tạo khách hàng của bạn). Phần quan trọng là 'reactor.callLater (0,1, tick)' được gọi một lần trước khi bạn gọi 'reactor.run()'. – sloth

+0

Tôi vẫn cần chạy 'reactor.ConnectTcp ('192.168.1.2', 6000, ChatClient())' và 'reactor.run' sau lệnh' main() '? Tôi đã đi trước và cố gắng này nhưng, bây giờ các sự kiện pygames không đáp ứng? – tijko

Các vấn đề liên quan