Я делаю многопользовательскую игру (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
различна для обоих игроков. Как я мог сделать эту работу?