set_global_position установка позиции на неправильное значение - PullRequest
0 голосов
/ 14 марта 2020

Привет, у меня есть функция, которая размещает тело KinematicBody2D (Player) рядом с Node2D (портал). 2 портала связаны друг с другом, и когда игрок входит в портал X в сцене A, они помещаются рядом с соответствующим порталом X в сцене B и наоборот. Вот функция:

func fix_player_position(entry_portal_link_id):
    var pos = exit_positions[entry_portal_link_id]
    var new_pos: Vector2
    print("Current entry points for ")
    print(exit_positions)
    $player.set_global_position(Vector2(0,0))
    print("Player's position before change: " + str($player.get_global_position()))

    if portal_list[entry_portal_link_id].landing_point == Direction.Up:
        new_pos = Vector2(pos.x, pos.y-64)
    elif portal_list[entry_portal_link_id].landing_point == Direction.Down:
        new_pos = Vector2(pos.x, pos.y+64)
    elif portal_list[entry_portal_link_id].landing_point == Direction.Left:
        new_pos = Vector2(pos.x-64, pos.y)
    elif portal_list[entry_portal_link_id].landing_point == Direction.Right:
        new_pos = Vector2(pos.x+64, pos.y)
    $player.set_global_position(new_pos)
    print(pos)
    print(new_pos)
    print($player.get_global_position())

здесь мы получаем позицию Node2D, сбрасываем позицию игроков (KinematicBody2D) в (0,0), применяем смещение в зависимости от того, с какой стороны мы хотим разместить KinematicBody2D, а затем установите новую позицию и распечатайте все позиции. Однако это не работает правильно. Вот последний вывод

Current entry points for 
{house_link1:(-3807.48999, 11041.799805), house_link2:(-4132.839844, 10655)} # We store the positions in a dictionary using the portal ID
Player's position before change: (-26252.199219, 11936) # This is supposed to be (0,0)
(-4132.839844, 10655) # The pos variable, i.e the stored position of the Node2D
(-4132.839844, 10719) # The new_pos, i.e. the intended position of the character
(-30385.039062, 22655) # The position of the character after setting

Комментарии # добавлены мной, чтобы уточнить, что выводится на печать. Как вы можете ясно видеть, вызов set_global_position неправильно устанавливает позицию. Однако он правильно устанавливает положение игроков в другой сцене.

Сцена A -> Сцена B, работает правильно

Сцена B -> Сцена A, неожиданно не работает правильно.

Как вы видите, я немного растерялся, это ошибка в самом gdscript? Или я идиот и делаю что-то не так?

Вот полный вывод перехода из Сцены A -> Сцена B -> Сцена A

Current entry points for 
{house_link1:(32, -288), house_link2:(-355.494995, -477.505005)}
Player's position before change: (0, 0)
(-355.494995, -477.505005) # pos
(-355.494995, -413.505005) # new_pos
(-355.494995, -413.505005) # players position

Current entry points for 
{house_link1:(-3807.48999, 11041.799805), house_link2:(-4132.839844, 10655)}
Player's position before change: (-26252.199219, 11936)
(-4132.839844, 10655) # pos
(-4132.839844, 10719) # new_pos
(-30385.039062, 22655) # players_position

1 Ответ

0 голосов
/ 12 апреля 2020

Так что я не уверен, в чем была реальная проблема, но решение было заменить

$player.set_global_position(new_pos)

на

$player.position = new_pos

, и код работает успешно.

...