summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkobewi <kobewi4e@gmail.com>2022-01-28 22:58:54 +0100
committerkobewi <kobewi4e@gmail.com>2022-01-29 00:36:39 +0100
commit038977a985722036d4e2e7f90e0b477225955d80 (patch)
tree250391af1e85f5bcd035bcc19ab1042b79d1d4b5
parentb9a2569be6fcd1127454127d989b504334d2dac8 (diff)
Better handle infinite Tween loops
-rw-r--r--doc/classes/Tween.xml2
-rw-r--r--scene/animation/tween.cpp10
2 files changed, 11 insertions, 1 deletions
diff --git a/doc/classes/Tween.xml b/doc/classes/Tween.xml
index 1cba995366..a1b53346d8 100644
--- a/doc/classes/Tween.xml
+++ b/doc/classes/Tween.xml
@@ -146,7 +146,7 @@
<description>
Sets the number of times the tweening sequence will be repeated, i.e. [code]set_loops(2)[/code] will run the animation twice.
Calling this method without arguments will make the [Tween] run infinitely, until it is either killed by [method kill] or by freeing bound node, or all the animated objects have been freed (which makes further animation impossible).
- [b]Warning:[/b] Make sure to always add some duration/delay when using infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] with no delay) are equivalent to infinite [code]while[/code] loops and will freeze your game.
+ [b]Warning:[/b] Make sure to always add some duration/delay when using infinite loops. 0-duration looped animations (e.g. single [CallbackTweener] with no delay or [PropertyTweener] with invalid node) are equivalent to infinite [code]while[/code] loops and will freeze your game. If a [Tween]'s lifetime depends on some node, always use [method bind_node].
</description>
</method>
<method name="set_parallel">
diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp
index 53ff3eeeae..a2fed718be 100644
--- a/scene/animation/tween.cpp
+++ b/scene/animation/tween.cpp
@@ -283,6 +283,10 @@ bool Tween::step(float p_delta) {
float step_delta = rem_delta;
step_active = false;
+#ifdef DEBUG_ENABLED
+ float prev_delta = rem_delta;
+#endif
+
for (Ref<Tweener> &tweener : tweeners.write[current_step]) {
// Modified inside Tweener.step().
float temp_delta = rem_delta;
@@ -312,6 +316,12 @@ bool Tween::step(float p_delta) {
start_tweeners();
}
}
+
+#ifdef DEBUG_ENABLED
+ if (Math::is_equal_approx(rem_delta, prev_delta) && running && loops <= 0) {
+ ERR_FAIL_V_MSG(false, "Infinite loop detected. Check set_loops() description for more info.");
+ }
+#endif
}
return true;