【发布时间】:2020-04-12 07:53:33
【问题描述】:
嘿,我有一个函数可以将 KinematicBody2D(播放器)的身体定位在 Node2D(门户)旁边。 2 个传送门连接在一起,当玩家在场景 A 中进入传送门 X 时,它们会被放置在场景 B 中相应的传送门 X 旁边,反之亦然。这是函数:
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
# cmets 是我添加的,以阐明打印的内容。正如您可以清楚地看到 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
【问题讨论】:
-
使用断点来遵循程序的流程。你如何转换场景?什么时候调用
fix_player_position()? -
我已经做到了。在断点之后,流程没有异常变化,它会按照您的预期逐步完成。我有一个单例场景切换器类,它交换节点并将预期场景设置为当前场景,然后在添加到树时调用 fix_player_position。我在这里摸不着头脑
-
你能发布一个最小的可重现项目或代码在本地测试吗?
-
你可以试试直接修改节点的
position属性,我觉得比较靠谱。也许是$player.position = "the portal".position之类的东西,或者改用$player.transform.origin。您还可以添加Vector2()以将玩家的位置偏移某个值。 -
这实际上是我最终解决问题的方法,但我忘了在这里更新。我会分享一个答案并关闭它