Godot 4.3 — 如何确保 _ready 中的控制位置正确?

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

我有一个程序,它使用

TextureRect
作为鼠标光标,以及一个滚动焦点系统。它工作正常,但在
_ready
中,我将鼠标的
global_position
设置为聚焦控件,然后出现问题。

_ready
中调用时,跳转到(0, -610);但如果我等待一个设置为 0.025 秒的计时器,然后分配它,它(正确地)跳转到 (0, 560)。检查我将光标跳过的控件的位置显示这些是控件在相应时间的
global_position
值。

我想我可以只

call_deferred
移动鼠标的功能,它就会解决它;但即便如此,我仍然得到不正确的 (0, -610) 坐标。

是什么让我出现这种奇怪的行为?我当前的解决方案感觉非常像黑客,我想做点别的事情,或者

await
一个信号,这样可以更干净地完成它。有点碍眼,也不知道自己在等什么。在什么情况下可以安全地将一个控件的
global_position
设置为另一个控件?

我正在全屏独占模式下运行(但也希望支持窗口),并且我的控件位于

CanvasLayer
中。根控件在垂直和水平方向上最大化,并且是
CanvasLayer
下的基础控件。

controls coordinates transform godot godot4
1个回答
0
投票

好的,这是我的问题。

进入场景树时,会调用两个函数;首先,

_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
中,一切都可以在所有窗口模式下正常工作。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.