Python pygame主循环中的扭曲客户端?
我正在尝试使用pygame客户端运行twisted服务器:Python pygame主循环中的扭曲客户端?,python,twisted,pygame,main,Python,Twisted,Pygame,Main,我正在尝试使用pygame客户端运行twisted服务器: class ChatClientProtocol(LineReceiver): def lineReceived(self,line): print (line) class ChatClient(ClientFactory): def __init__(self): self.protocol = ChatClientProtocol def main(): flag = 0
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时,不应该编写自己的主循环(使用而)。twisted必须控制主循环,pygame足够灵活,不必在意(它不需要自己的循环)
您应该将主循环中的所有内容都放入一个函数中,并通过调用reactor.CallLater()
通过这种方式,您可以确保反应器运行并能够处理网络事件
下面是一个小的客户端工作示例,它只渲染接收到的最后一行:
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/factory类,因为它们与上面相同):
有些东西不起作用了吗?你的问题在哪里?我会编辑以更透彻地解释。我应该在勾号和main之后调用reactor.run()
?我想我需要启动它,或者这会阻止main和tick运行吗?因为没有它,pygame屏幕启动然后退出,pygame屏幕根本不会出现(因此没有调用main),只需调用main()
一次(或者调用任何代码来初始化客户端)。重要的是reactor.callLater(0.1,勾选)
在调用reactor.run()
之前被调用一次。我仍然需要运行reactor.ConnectTcp('192.168.1.2',6000,ChatClient())
和reactor.run
在main()
调用之后?我已经尝试过了,但是现在pygames事件没有响应?我被指向twisted.internet.task.Cooperator()
,这也是一个很好的方法。twisted.internet.task.LoopingCall
比Cooperator
更接近您想要的。您希望在帧之间放置一些实际时间-合作者
假设如果您没有返回一个延迟的
,并且速度非常快,那么总是有更多的工作要做。另外,LoopingCall
具有withCount
,允许您缩放输入的大小(例如,如果用户按住“向上”键4帧,您可能希望将其移动4像素)。
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()
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()