Python 使用套接字和pickle在pygame中发送和接收多个对象
我正在用pygame制作多人游戏(2台主机,本地网络)。我是socket编程的新手,无法处理发送和接收多个数据的问题。我从中得到了非常好的代码:但它只显示了如何将一个对象发送给两个玩家。 我想通过添加怪物和射击机制来修改它,但我不知道如何将Python 使用套接字和pickle在pygame中发送和接收多个对象,python,sockets,pygame,python-sockets,Python,Sockets,Pygame,Python Sockets,我正在用pygame制作多人游戏(2台主机,本地网络)。我是socket编程的新手,无法处理发送和接收多个数据的问题。我从中得到了非常好的代码:但它只显示了如何将一个对象发送给两个玩家。 我想通过添加怪物和射击机制来修改它,但我不知道如何将Mob对象发送给每个玩家并实时更新这个怪物 我对服务器脚本进行了如下修改: server.py objects = [Player(200,500-50, 50,50, (0,255,0)), Player(400,500-50, 50
Mob
对象发送给每个玩家并实时更新这个怪物
我对服务器脚本进行了如下修改:
server.py
objects = [Player(200,500-50, 50,50, (0,255,0)),
Player(400,500-50, 50,50, (0,0,255)),
Mob(200,-1,30,40,(255,0,0))]
def threaded_client(conn, player):
conn.send(pickle.dumps(objects[player]))
reply = []
while True:
try:
data = pickle.loads(conn.recv(2048))
objects[player] = data
if not data:
print("Disconnected")
break
else:
if player == 1:
reply = objects[0], objects[2]
reply = list(reply)
else:
reply = objects[1], objects[2]
reply = list(reply)
print("Received: ", data)
print("Sending : ", reply)
conn.sendall(pickle.dumps(reply))
except:
break
print("Lost connection")
conn.close()
客户端看起来几乎和原来的一样(只更改了redrawWindow())
client.py
def redrawWindow(win,player, player2):
win.fill((255,255,255))
player.draw(win)
player2[0].draw(win)
player2[1].draw(win)
pygame.display.update()
def main():
run = True
n = Network()
p = n.getP()
clock = pygame.time.Clock()
while run:
clock.tick(60)
p2 = n.send(p)
print(p2)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
p.move()
redrawWindow(win, p, p2)
pygame.display.flip()
移动类-Mob.py:
import pygame
import random
WIDTH = 500
HEIGHT = 600
class Mob():
def __init__(self, x, y, width, height, color):
self.x = x
self.y = y
self.width = width
self.height = height
self.color = color
self.rect = (x, y, width, height)
self.vel = 1
def draw(self, win):
pygame.draw.rect(win, self.color, self.rect)
self.move()
def move(self):
self.y += self.vel
self.update()
def update(self):
self.rect = (self.x, self.y, self.width, self.height)
通过我对代码的修改,
mob
被发送到每个玩家,但是这个mob
不会改变它的位置。如果我只在客户端绘制mob
,它可以正常工作,但mob
的位置对于两个玩家都是不同的。我怎样才能做到这一点呢?因为您使用的是pickle
,所以您可以通过将多个对象全部放入列表中并pickle/unpickle来发送它们。有关保存对象的另一个问题,请参见结尾处的“多个对象”部分。由于您使用的是pickle
,因此可以通过将多个对象全部放入列表中并对其进行pickle/取消pickle来发送多个对象。有关保存对象的另一个问题,请参见本部分末尾的“多个对象”部分。