Я пытаюсь сделать онлайн-игру, используя как pygame, так и сокеты. Я новичок в сокетах, поэтому у меня возникли проблемы.
Пока что каждый игрок - это просто квадрат, который перемещается по экрану по команде. Таким образом, каждый игрок должен видеть точное положение другого игрока в режиме реального времени.
То, что я до сих пор придумал, это:
#server.py
class Play:
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#sk.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1)
def __init__(self):
#players positions
self.x, self.y = 200, 400
self.j, self.k = 400, 200
#wait for client
self.sk.bind(('', 12345))
data, self.adr = self.sk.recvfrom(1024)
#self.sk.setblocking(0)
self.sk.settimeout(0.05)
re_th = threading.Thread(target=self.receive)
re_th.daemon = True
re_th.start()
self.run()
функция запуска:
def run(self):
win = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()
while True:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.x > 0:
self.x -= vel
if keys[pygame.K_RIGHT] and self.x < width - cw:
self.x += vel
if keys[pygame.K_UP] and self.y > 0:
self.y -= vel
if keys[pygame.K_DOWN] and self.y < height - ch:
self.y += vel
self.send()
#draws on screen both player's squares
clock.tick(60)
Функции отправки и получения:
def send(self):
co = json.dumps((self.x, self.y))
self.sk.sendto(co.encode('utf-8'), self.adr)
def receive(self):
while True:
try:
data, xadr = self.sk.recvfrom(1024)
self.j, self.k = (json.loads(data.decode('utf-8')))
except OSError:
pass
Файл клиента очень похож.
Функция запуска принимает пользовательский ввод для перемещения квадрата, отправляет координаты другому игроку, а затем рисует на экране обоих игроков. Все в то же время, когда поток получает координаты x и y другого игрока.
Локально это работает, я заметил некоторую задержку, которую, по-моему, быть не должно, поскольку она локальна, а через Интернет - медленнее.
Что я делаю не так? Что я могу сделать лучше?
Заранее спасибо