pygame主循环中扭曲的客户端



我正试图用pygame客户端运行一个扭曲的服务器:

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

这是服务器:

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

我正在使用客户端代码运行这个服务器,而不使用reactor。CallLater()方法和pygames代码,客户端连接良好。我使用reactor方法是错误的,还是pygames代码在结构上有问题?如有任何帮助,我们将不胜感激。

所以我不知道pygames中的循环是否会中断,再次调用反应堆?

使用twisted时,您不应该编写自己的主循环(使用while)。twisted必须控制主循环,pygame足够灵活,不需要关心(它不需要自己的循环)。

您应该将主循环中的所有内容放入一个函数中,并通过调用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)

通过这种方式,您可以确保reactor运行并能够处理网络事件。


下面是一个客户端的小工作示例,它只会呈现收到的最后一行:

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的简单示例,正如Glyph所建议的那样(我省略了protocoll/工厂类,因为它们与上面相同):

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

相关内容

  • 没有找到相关文章

最新更新