Я пытаюсь создать простую многопользовательскую игру в Python с использованием модулей pygame
и socket
. Он состоит из двух кругов, которые управляются клавишами W, A, S, D с двух разных компьютеров.
Сначала я создал клиента с recv()
в середине пигмеи l * 1041. *. Он работал хорошо, но recv()
заблокировал l oop, поэтому движение кругов было не плавным, и мне пришлось увеличить скорость до 6 (до того, как она была установлена на 0,6), чтобы иметь нормальную скорость. Вот код (я его немного суммировал):
Клиент 1-й версии
#import modules
def main(sock):
pygame.init()
#Display screen and set initial me_x and me_y
vel = 0.6
while True:
keys_pressed = pygame.key.get_pressed()
#Change me_x and me_y (with A, D, W, S keys)
#Make sure me_x and me_y don't get off the screen
screen.fill(color)
if other_x and other_y:
pygame.draw.circle(screen, colorMe, (other_x, other_y), radi)
pygame.draw.circle(screen, colorOther, (int(me_x), int(me_y)), radi)
pygame.display.flip()
sock.send(int(me_x).to_bytes(3, byteorder = 'big') + int(me_y).to_bytes(3, byteorder = 'big'))
otherPos = sock.recv(BUFSIZ)
other_x = int.from_bytes(otherPos[:3], byteorder = 'big')
other_y = int.from_bytes(otherPos[3:], byteorder = 'big')
print(other_x, other_y)
#CONNECT TO TCP SOCKET
other_x = None
other_y = None
main(client_socket)
Затем я попытался поместить recv()
в поток, чтобы прекратить блокировать l oop:
Клиент 2-й версии
#import modules
def main(sock):
pygame.init()
#Display screen and set initial me_x and me_y
vel = 0.6
while True:
for i in range(30):
keys_pressed = pygame.key.get_pressed()
#Change me_x and me_y (with A, D, W, S keys)
#Make sure me_x and me_y don't get off the screen
screen.fill(color)
if other_x and other_y:
pygame.draw.circle(screen, colorOther, (other_x, other_y), 15)
pygame.draw.circle(screen, colorMe, (int(me_x), int(me_y)), 15)
pygame.display.flip()
msg = int(me_x).to_bytes(3, byteorder = 'big') + int(me_y).to_bytes(3, byteorder = 'big')
sock.send(msg)
def recv_pos(sock):
while True:
other_pos = sock.recv(BUFSIZ)
other_x = int.from_bytes(other_pos[:3], byteorder = 'big')
other_y = int.from_bytes(other_pos[3:], byteorder = 'big')
print(other_x, other_y)
#CONNECT TO TCP SOCKET
other_x = None
other_y = None
receive_thread = threading.Thread(target = recv_pos, args = (client_socket,))
receive_thread.daemon = True
receive_thread.start()
main(client_socket)
Однако, когда я запускаю 2 экземпляра клиента 2 на двух разных компьютерах, он дает мне OverflowError
:
OverflowError: Python int слишком велик для преобразования в C long
Я добавил for i in range(30):
, потому что думал, что сервер падает, потому что было слишком много сообщений отправляется в то же время. Вывод такой же: через 3 секунды более или менее происходит сбой программы, выдавая OverflowError
.
. Я добавил оператор print()
в обеих версиях сразу после recv()
, чтобы увидеть, какие значения x и я получил. В 1-й версии все они были в диапазоне ширины и высоты. Однако во второй версии 1/5 полученных сообщений было большим числом, таким как 124381473265
. Если это число еще больше, оно дает OverflowError
. Я не понимаю, почему это происходит: я кодирую и декодирую сообщения одинаково в обеих версиях, но одна работает, а другая нет.
Я не включаю код сервера потому что я не думаю, что это необходимо. Он просто передает сообщения между обоими клиентами без их изменения. Сервер не является ошибкой, так как в 1-й версии клиента сообщения отправляются и принимаются правильно.
Любая помощь приветствуется. Если вам нужна дополнительная информация по любому вопросу, просто скажите мне.
Заранее спасибо!