diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-01-29 21:34:13 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-01-29 21:34:13 +0100 |
commit | 86f6811752683c79ad05ee6c075b180ab20352aa (patch) | |
tree | 52ea064d4e755f07225ceb323465bd9d51747613 | |
parent | 6809791feec71790046a266707eb37dfb4721a4e (diff) | |
parent | 0de8a736dad9bf9ed5b8075946bf1e96a47b20f6 (diff) | |
download | redot-engine-86f6811752683c79ad05ee6c075b180ab20352aa.tar.gz |
Merge pull request #87701 from KoBeWi/extratreestial_tweens
Allow `Node.create_tween()` outside SceneTree
-rw-r--r-- | doc/classes/Node.xml | 5 | ||||
-rw-r--r-- | scene/main/node.cpp | 10 |
2 files changed, 11 insertions, 4 deletions
diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 5dd3d22062..98f75f4d92 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -205,7 +205,7 @@ <method name="create_tween"> <return type="Tween" /> <description> - Creates a new [Tween] and binds it to this node. Fails if the node is not inside the tree. + Creates a new [Tween] and binds it to this node. This is the equivalent of doing: [codeblocks] [gdscript] @@ -215,7 +215,8 @@ GetTree().CreateTween().BindNode(this); [/csharp] [/codeblocks] - The Tween will start automatically on the next process frame or physics frame (depending on [enum Tween.TweenProcessMode]). + The Tween will start automatically on the next process frame or physics frame (depending on [enum Tween.TweenProcessMode]). See [method Tween.bind_node] for more info on Tweens bound to nodes. + [b]Note:[/b] The method can still be used when the node is not inside [SceneTree]. It can fail in an unlikely case of using a custom [MainLoop]. </description> </method> <method name="duplicate" qualifiers="const"> diff --git a/scene/main/node.cpp b/scene/main/node.cpp index f25e178d23..b78dfb2f2c 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -2326,8 +2326,14 @@ void Node::_propagate_replace_owner(Node *p_owner, Node *p_by_owner) { Ref<Tween> Node::create_tween() { ERR_THREAD_GUARD_V(Ref<Tween>()); - ERR_FAIL_NULL_V_MSG(data.tree, nullptr, "Can't create Tween when not inside scene tree."); - Ref<Tween> tween = get_tree()->create_tween(); + + SceneTree *tree = data.tree; + if (!tree) { + tree = SceneTree::get_singleton(); + } + ERR_FAIL_NULL_V_MSG(tree, Ref<Tween>(), "No available SceneTree to create the Tween."); + + Ref<Tween> tween = tree->create_tween(); tween->bind_node(this); return tween; } |