可以在select.select输入列表中处理pygame事件吗?

时间:2014-01-31 10:46:35

标签: python sockets select pygame multiplayer

python select.select的文档说:

  

请注意,在Windows上,它仅适用于套接字;在其他经营   系统,它也适用于其他文件类型(特别是在Unix上,   它适用于管道。)

我的小组正在使用pygame和sockets开发一款简单的多人游戏。 (我们使用Twisted或zeromq或任何类似的库;这是唯一的约束。)

现在,对于游戏设计;我们希望播放器在pygame屏幕中发生键事件时将数据发送到服务器。否则,客户端/玩家端的套接字将被连接到服务器并监听其他玩家方面发生的变化。对于这个任务,我需要pygame和socket并行工作。我被建议在#python上使用来自多个用户的select模块。

我可以这样做:

inp = [self.sock, pygame.event.get]
out = [self.server]
i, o, x = select.select( inp, out, [] )

如果没有,那该怎么办?

1 个答案:

答案 0 :(得分:2)

您可以使用线程执行此任务。是否有必要串行处理服务器消息和pygame事件(不是同时发生)?如果是这样,你可以这样做:

class SocketListener(threading.Thread):
    def __init__(self, sock, queue):
         threading.Thread.__init__(self)
         self.daemon = True
         self.socket = sock
         self.queue = queue
    def run(self):
         while True:
             msg = self.socket.recv()
             self.queue.put(msg)
class PygameHandler(threading.Thread):
    def __init__(self, queue):
         threading.Thread.__init__(self)
         self.queue = queue
         self.daemon = True
    def run(self):
         while True:
             self.queue.put(pygame.event.wait())
queue = Queue.Queue()
PygameHandler(queue).start()
SocketListener(queue).start()
while True:
    event = queue.get()
    """Process the event()"""

如果没有,您可以处理PygameHandlerSocketListener类的运行方法中的事件。