Browse Source

Merge pull request #96216 from BlackShift/master

Fix Tweeners to emit `finished()` when underlying object is deleted
Rémi Verschelde 11 tháng trước cách đây
mục cha
commit
7d9ab705c9
3 tập tin đã thay đổi với 5 bổ sung1 xóa
  1. 1 0
      doc/classes/PropertyTweener.xml
  2. 1 1
      doc/classes/Tweener.xml
  3. 3 0
      scene/animation/tween.cpp

+ 1 - 0
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>

+ 1 - 1
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>

+ 3 - 0
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;
 	}