Godot 4.1 global_position 是偏移的。为什么?

问题描述 投票:0回答:3

如果我使用玩家位置来定位激光,我会像我想要的那样将激光置于玩家的原点。不幸的是,我需要玩家的 global_position 来定位激光。但每次我尝试这样做时,它都会向右和向下偏移。为什么会出现这种情况。

我已经设置了一些代码和结果的演示图像。两个激光应该位于同一点,但使用 global_position 的第二个激光不在玩家的原点。

enter image description here

enter image description here

enter image description here

我试图找到根本原因,但没有找到。

在我的理解中,两种激光应该重叠。

更新: 现在我尝试了这个:“laser2.global_position = $Player.global_position”,但它也不起作用。我得到与“laser2.position = $Player.global_position”相同的结果。

我使用global_position的原因是因为我想用Marker2D在枪的顶部产生激光。我将通过玩家节点中的 Marker2D.global_position 获取生成的位置。然后我通过 Marker2D 的position = global_position 在关卡中生成激光。

就像本教程中的那样 https://youtu.be/nAh_Kx5Zh5Q?t=11008

nodes game-engine godot gdscript godot4
3个回答
0
投票

不是 100% 确定,但也许激光的原点是你在玩家周围绘制的碰撞形状的第一个点的位置?

:-)


0
投票

链接图像中的代码显示:

laser.position = $Player.position
add_child(laser)

在这种情况下,代码在

$Player
的父级(因为您可以使用此语法获取它)和
laser
(因为您将其添加为子级)中运行。

因此

$Player
laser
具有相同的局部坐标(它们相对于其父级具有相同的坐标,因为它们具有相同的父级)。

因此这里使用

position
就可以了。


链接图像中的代码还显示:

laser2.position = $Player.global_position

在这里,您将

laser2
相对于其父级的位置设置为等于
$Player
相对于世界原点的位置。它们不是同一来源,我们不能相信这会起作用。

如果这不起作用,那是因为父级(附加了

Node
Script
)不在世界原点(或者应用了一些缩放或其他变换)。

相反,使用全局坐标是安全的,如下所示:

laser2.global_position = $Player.global_position

除非您必须在添加新的

Node
后执行此操作:

add_child(laser2)
laser2.global_position = $Player.global_position

另一种选择是使用

global_position
to_local
转换为本地坐标:

laser2.position = to_local($Player.global_position)
add_child(child_sprite)

在您的情况下,您不需要执行此操作,因为如开始时所述,本地坐标匹配(因此您可以直接设置

position
)。但是,在与当前情况不同的其他情况下,这可能很有用。


0
投票

我知道这是一个老问题,但我目前正在研究相同的教程并且发生了同样的事情。

为我解决的问题是,在某个时刻,我的关卡场景的基本 Node2D 被移动,当我将该节点的 X 和 Y 重置为 0, 0 时,global_position 的工作方式与视频中一样。

希望这对未来的学习者有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.