Python 使用套接字和pickle在pygame中发送和接收多个对象

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

我正在用pygame制作多人游戏(2台主机,本地网络)。我是socket编程的新手,无法处理发送和接收多个数据的问题。我从中得到了非常好的代码:但它只显示了如何将一个对象发送给两个玩家。 我想通过添加怪物和射击机制来修改它,但我不知道如何将
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来发送多个对象。有关保存对象的另一个问题,请参见本部分末尾的“多个对象”部分。