我有一个程序,它使用
TextureRect
作为鼠标光标,以及一个滚动焦点系统。它工作正常,但在 _ready
中,我将鼠标的 global_position
设置为聚焦控件,然后出现问题。
在
_ready
中调用时,跳转到(0, -610);但如果我等待一个设置为 0.025 秒的计时器,然后分配它,它(正确地)跳转到 (0, 560)。检查我将光标跳过的控件的位置显示这些是控件在相应时间的 global_position
值。
我想我可以只
call_deferred
移动鼠标的功能,它就会解决它;但即便如此,我仍然得到不正确的 (0, -610) 坐标。
是什么让我出现这种奇怪的行为?我当前的解决方案感觉非常像黑客,我想做点别的事情,或者
await
一个信号,这样可以更干净地完成它。有点碍眼,也不知道自己在等什么。在什么情况下可以安全地将一个控件的 global_position
设置为另一个控件?
我正在全屏独占模式下运行(但也希望支持窗口),并且我的控件位于
CanvasLayer
中。根控件在垂直和水平方向上最大化,并且是 CanvasLayer
下的基础控件。
好的,这是我的问题。
进入场景树时,会调用两个函数;首先,
_enter_tree
,然后,_ready
。它们也与信号相关。 _ready
并不意味着我的数据和元数据(如我的焦点列表)已充分更新或正确,并且某些内容(例如位置)可能不正确;但通过在 _enter_tree
信号期间设置某些内容,我可以确保这一点。
因此,我将鼠标纹理的输入树信号绑定到一个函数,该函数更新我的焦点列表,然后移动鼠标,如下所示:
func _on_mouse_tree_entered() -> void:
$Mouse.focus_list = focus_list
$Mouse.move_mouse_to_focus()
move_mouse_to_focus 所做的就是将鼠标的显示位置更新为位于该特定焦点坐标上。只要通过事件回调完成,而不是在
_ready
中,一切都可以在所有窗口模式下正常工作。