Can pygame events be handled in select.select inpu

2019-07-20 11:30发布

问题:

The documentation for python's select.select says:

Note that on Windows, it only works for sockets; on other operating systems, it also works for other file types (in particular, on Unix, it works on pipes).

My group is developing a simplistic multiplayer game using pygame and sockets. (We are not using Twisted or zeromq or any similar libraries; this being the only constraint).

Now, for the game design; we want the player to send data to the server when a key event occurs in the pygame screen. The client/player side's socket will otherwise be hooked to server and listen for changes occurring on other players' side. For this task, I'd need the pygame and socket to work parallely. I was recommended to use select module from several users on #python.

Can I do something like:

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

If not, what should be the way to go?

回答1:

You could use threads for this task. Is it necessary to process server messages and pygame events in series (not concurrently)? If so, you could do this:

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

If not, you could process the events inside the run methods of the PygameHandler and SocketListener classes.