summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-08-30 09:59:35 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-08-30 09:59:35 +0200
commit7d9ab705c990d06e68f7556ef7d29264f469475e (patch)
tree651e6c6b281e4e3139ed162e1d8e4ff5488419f5
parent228a4e7a1d3b2a065ce05170ed82c87d5b95b54e (diff)
parent1abd67caace2c51fbf5577ec817f44d4ccc677c7 (diff)
downloadredot-engine-7d9ab705c990d06e68f7556ef7d29264f469475e.tar.gz
Merge pull request #96216 from BlackShift/master
Fix Tweeners to emit `finished()` when underlying object is deleted
-rw-r--r--doc/classes/PropertyTweener.xml1
-rw-r--r--doc/classes/Tweener.xml2
-rw-r--r--scene/animation/tween.cpp3
3 files changed, 5 insertions, 1 deletions
diff --git a/doc/classes/PropertyTweener.xml b/doc/classes/PropertyTweener.xml
index b7aa6947d9..76cf4cbfeb 100644
--- a/doc/classes/PropertyTweener.xml
+++ b/doc/classes/PropertyTweener.xml
@@ -5,6 +5,7 @@
</brief_description>
<description>
[PropertyTweener] is used to interpolate a property in an object. See [method Tween.tween_property] for more usage information.
+ The tweener will finish automatically if the target object is freed.
[b]Note:[/b] [method Tween.tween_property] is the only correct way to create [PropertyTweener]. Any [PropertyTweener] created manually will not function correctly.
</description>
<tutorials>
diff --git a/doc/classes/Tweener.xml b/doc/classes/Tweener.xml
index 65148e875d..88f5f9978c 100644
--- a/doc/classes/Tweener.xml
+++ b/doc/classes/Tweener.xml
@@ -11,7 +11,7 @@
<signals>
<signal name="finished">
<description>
- Emitted when the [Tweener] has just finished its job.
+ Emitted when the [Tweener] has just finished its job or became invalid (e.g. due to a freed object).
</description>
</signal>
</signals>
diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp
index f8bbd704f4..e1fd8abede 100644
--- a/scene/animation/tween.cpp
+++ b/scene/animation/tween.cpp
@@ -579,6 +579,7 @@ bool PropertyTweener::step(double &r_delta) {
Object *target_instance = ObjectDB::get_instance(target);
if (!target_instance) {
+ _finish();
return false;
}
elapsed_time += r_delta;
@@ -706,6 +707,7 @@ bool CallbackTweener::step(double &r_delta) {
}
if (!callback.is_valid()) {
+ _finish();
return false;
}
@@ -770,6 +772,7 @@ bool MethodTweener::step(double &r_delta) {
}
if (!callback.is_valid()) {
+ _finish();
return false;
}