我正在尝试编写具有多人游戏的游戏。游戏逻辑构建良好,但客户端/服务器部分不起作用。我不知道哪里是错误或错误的代码。
因此,我有一个服务器部分,它使用UPD将数据包发送到客户端(在这里使用UPD是个好主意吗?或者在这种情况下使用TCP更好?)并处理游戏会话。我决定在服务器上管理游戏对象,并仅将有关它们的信息发送给客户端。服务器部分运作良好。
我得到了客户的支持。这是代码:
class Client:
def __init__(self,port):
self.socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self.socket.bind(("localhost",port))
self.server_data=[]
def listen_socket(self):
while True:
data=self.socket.recvfrom(1024)
print(data)
self.server_data.append([json.loads(data[0].decode("utf-8"))])
def get_data_from_queque(self):
if len(self.server_data)>0:
return self.server_data.pop(0)
return []
def send_data(self,data):
self.socket.sendto(json.dumps(data).encode("utf-8"),self.server)
在游戏周期中,我处理新的数据包,并使用从数据包中获取的信息来更新精灵的位置。 这是游戏代码的一部分:
class Multiplayer(Game):
def __init__(self,scr,port):
super().__init__(scr)
self.client=Client(port)
Thread(target=self.client.listen_socket,daemon=True).start()
def game_cycle(self):
keys=pygame.key.get_pressed()
if keys[pygame.K_LEFT]: self.client.send_data("LEFT")
elif keys[pygame.K_RIGHT]:self.client.send_data("RIGHT")
for data in self.client.get_data_from_queque():
if data:
self.ball.rect.x,self.ball.rect.y,self.ball.dx,self.ball.dy=data["BALL"][0],data["BALL"][1],data["BALL"][2],data["BALL"][3]
self.ball_platform_1.rect.x,self.ball_platform_1.rect.y=data["PLATFORM1"][0],data["PLATFORM1"][1]
self.ball_platform_2.rect.x,self.ball_platform_2.rect.y=data["PLATFORM2"][0],data["PLATFORM2"][1]
self.score_1=data["SCORE1"]
self.score_2=data["SCORE2"]
self.game_status=data["GAME_STATUS"]
self.output_text("Score: {}".format(self.score_1),(20,30),(255,0,0))
self.ball.draw()
self.ball_platform_1.draw()
self.ball_platform_2.draw()
当我尝试运行此代码时,什么都没有发生。当游戏开始时,我按了一些按键显示更新,但是如果不按按键就不会更新。问题出在哪里?