gpt4 book ai didi

python - pygame事件在几秒钟的延迟后响应

转载 作者:行者123 更新时间:2023-12-03 11:55:43 25 4
gpt4 key购买 nike

为了克服my previous problem(Can pygame events be handled in select.select input list?);我重写了my client script,如下所示:

import socket, select, pygame, pygame.locals, random, json

colours = [
(19, 225, 30),
(41, 2, 245),
(251, 240, 32),
(255, 255, 255),
(0, 0, 0),
(255, 0, 0)
]

class client:
def __init__( self, host, port ):
self.server = self.servehost, self.serveport = host, port
self.client = self.address, self.port = "localhost", random.randrange( 8000, 9000 )
self.connection = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
self.connection.setblocking( 0 )
self.connection.bind( self.client )
self.readers = [ self.connection ]
self.writers = []
self.launchPygame( 600, 800, colours[2] )

def launchPygame( self, height, width, colour ):
self.screen = pygame.display.set_mode( (width, height) )
self.screen.fill( colour )
pygame.display.flip()

def newColour( self ):
return colours[ random.randrange(0, len(colours)) ]

def run( self ):
flag = True
clock = pygame.time.Clock()
fps = 30
try:
self.connection.sendto( "JOIN", self.server )
while flag:
clock.tick( fps )
r, w, e = select.select( self.readers, self.writers, [], 4 )
for f in r:
if f is self.connection:
data, addr = f.recvfrom( 32 )
print data

for event in pygame.event.get():
if event.type in [ pygame.QUIT, pygame.locals.QUIT ]:
flag = False
break
elif event.type == pygame.locals.KEYDOWN:
if event.key == pygame.locals.K_ESCAPE:
flag = False
break
else:
new_colour = self.newColour()
self.screen.fill( new_colour )
self.connection.sendto( json.dumps(new_colour), self.server )
pygame.event.clear( pygame.locals.KEYDOWN )
pygame.display.update()
except socket.error, e:
print e
finally:
self.connection.sendto( "LEAVE", self.server )

if __name__ == "__main__":
c = client( 'localhost', 1992 )
c.run()

the server script仅继续监听传入的连接并打印数据。
import select, socket, sys

class server:
def __init__( self, host, port ):
self.listener = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
self.address = self.host, self.port = host, port
self.listener.bind( self.address )
self.reading = [ self.listener ]
self.writing = []
self.clients = {}

def run( self ):
while True:
try:
data, addr = self.listener.recvfrom( 32 )
print data
except socket.error, e:
print e

if __name__ == "__main__":
s = server( 'localhost', 1992 )
s.run()

上面的脚本运行良好(套接字正在与pygame屏幕输入并行监听),但是pygame输入已排队并在一次运行中处理。我希望程序在保持游戏正常运行的同时监听服务器上的响应。

最佳答案

没关系,由于timeout setting in select.select调用,我变得比较滞后。我更改了以下内容:

r, w, e = select.select( self.readers, self.writers, [], 4 )


r, w, e = select.select( self.readers, self.writers, [], 0 )

并且它按预期工作。

关于python - pygame事件在几秒钟的延迟后响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com