Учет латентности в простой многопользовательской игре? - PullRequest
0 голосов
/ 24 сентября 2019

На данный момент, чтобы учесть задержку, в моей игре (это, по сути, троны света, но чтобы двигаться, нужно решить математическую задачу), я посылаю состояние игры обоим игрокам каждый раз, когда один из игроков поворачивается,На веб-интерфейсе у меня есть функция, которая рисует, и функция, которая отрисовывает (для учета задержки).В настоящее время установка не выполняет желаемого поведения: игроки не синхронизированы друг с другом (ни движения, ни позиции, на которых поворачиваются пользователи, не одинаковы для обоих игроков).Кто-нибудь может мне помочь?Я впервые делаю игру.Вот код бэкэнда (этот код запускается, когда пользователь отправляет ответ на математическую задачу, чтобы повернуть свой символ):

def send_answer(answer, game_object, player_type, current_position, current_direction):

    creator_directions = ['p1up', 'p1right', 'p1down', 'p1left']
    opponent_directions = ['p2up', 'p2right', 'p2down', 'p2left']

    with transaction.atomic():
        # d for direction

        if player_type == 'creator':
            for d in creator_directions:

                if is_correct_answer(getattr(game_object, d), int(answer)):
                    context['move_direction'] = d
                    print(context)
                    new_problem = generate_problem_game(
                        game_object.level, game_object.operation, game_object, player_type)
                    setattr(game_object, d, new_problem)
                    game_object.save()
                    context['new_problem'] = [d, new_problem]
                    # calculate draw and undraw positions
                    # p1_last_pos: player 1 last position
                    p1_last_pos = game_object.p1lastposupdate
                    # p1_lp_timestamp: player 1 last position timestamp
                    p1_lp_timestamp = game_object.p1lpuTimestamp
                    time_inbetween = timezone.now() - p1_lp_timestamp
                    # ti_milliseconds: time inbetween, milliseconds
                    ti_milliseconds = time_inbetween.seconds * 1000
                    # p1_lp_split: player 1 last_position (split)
                    p1_lp_split = p1_last_pos.split(',')
                    # p1_lp_x: player 1 last position, x
                    p1_lp_x = int(p1_lp_split[0])
                    # p1_lp_y: player 1 last_position, y
                    p1_lp_y = int(p1_lp_split[1])

                    draw_positions = []
                    if current_direction == 'up' or current_direction == 'down':
                        # works with 100ms loop on front end
                        # cycles move 4 pixels every 100ms
                        space_inbetween_x = int(
                            (ti_milliseconds / 100) * 4)
                        for i in range(0, space_inbetween_x, 4):
                            draw_positions.append(
                                '%s,%s' % (str(p1_lp_x + i), str(p1_lp_y)))
                    elif current_direction == 'left' or current_direction == 'right':
                        space_inbetween_y = int(
                            (ti_milliseconds / 100) * 4)
                        for i in range(0, space_inbetween_y, 4):
                            draw_positions.append(
                                '%s,%s' % (str(p1_lp_x), str(p1_lp_y + i)))

                    context['cdp'] = draw_positions
                    context[
                        'p1_last_pos_update'] = game_object.p1lastposupdate

        elif player_type == 'opponent':
            for d in opponent_directions:
                if is_correct_answer(getattr(game_object, d), int(answer)):
                    context['move_direction'] = d

                    new_problem = generate_problem_game(
                        game_object.level, game_object.operation, game_object, player_type)

                    setattr(game_object, d, new_problem)
                    game_object.save()

                    context['new_problem'] = [d, new_problem]

                    # calculate draw and undraw positions
                    # p2_last_pos = player 2 last position
                    p2_last_pos = game_object.p2lastposupdate
                    # p2_lp_timestamp: player 2 last position timestamp
                    p2_lp_timestamp = game_object.p2lpuTimestamp
                    time_inbetween = timezone.now() - p2_lp_timestamp
                    # ti_milliseconds: time inbetween, milliseconds
                    ti_milliseconds = time_inbetween.seconds * 1000
                    # p2_lp_split: player 2 last position (split)
                    p2_lp_split = p2_last_pos.split(',')
                    # p2_lp_x: player 2 last position, x
                    p2_lp_x = int(p2_lp_split[0])
                    # p2_lp_y: player 2 last position, y
                    p2_lp_y = int(p2_lp_split[1])

                    draw_positions = []
                    if current_direction == 'up' or current_direction == 'down':
                        # works with 100ms loop on front end
                        # cycles move 4 pixels every 100ms
                        space_inbetween_x = int(
                            (ti_milliseconds / 100) * 4)
                        for i in range(0, space_inbetween_x, 4):
                            draw_positions.append(
                                '%s,%s' % (str(p2_lp_x + i), str(p2_lp_y)))
                    elif current_direction == 'left' or current_direction == 'right':
                        space_inbetween_y = int(
                            (ti_milliseconds / 100) * 4)
                        for i in range(0, space_inbetween_y, 4):
                            draw_positions.append(
                                '%s,%s' % (str(p2_lp_x), str(p2_lp_y + i)))

                    context['odp'] = draw_positions
                    context[
                        'p2_last_pos_update'] = game_object.p2lastposupdate

Возможно, я даже не кодирую то, что хочу сделать правильно.Кто-нибудь может помочь?Заранее спасибо.

Я думаю, что это должно сработать, но если вам нужен код внешнего интерфейса, вы можете найти его на apollius.com в app.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...