diff options
author | kobewi <kobewi4e@gmail.com> | 2022-01-28 22:58:54 +0100 |
---|---|---|
committer | kobewi <kobewi4e@gmail.com> | 2022-01-29 00:36:39 +0100 |
commit | 038977a985722036d4e2e7f90e0b477225955d80 (patch) | |
tree | 250391af1e85f5bcd035bcc19ab1042b79d1d4b5 | |
parent | b9a2569be6fcd1127454127d989b504334d2dac8 (diff) |
Better handle infinite Tween loops
-rw-r--r-- | doc/classes/Tween.xml | 2 | ||||
-rw-r--r-- | scene/animation/tween.cpp | 10 |
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; |