Отправка и получение нескольких объектов в Pygame с сокетами и рассолом - PullRequest
1 голос
/ 28 января 2020

Я делаю многопользовательскую игру (2 хоста, локальная сеть) в Pygame. Я новичок ie в программировании сокетов и не могу решить проблему с отправкой и получением нескольких данных. Я получил этот довольно хороший код из этого: Python Учебник по онлайн-играм - Отправка объектов - techwithtim. net, но он показывает только, как отправить один объект обоим игрокам. Я хочу изменить это, добавив мобов и механизм стрельбы c, но я не могу понять, как отправить объект 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 class - 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 различна для обоих игроков. Как я мог сделать эту работу?

...