فهرست منبع

Merge pull request #56648 from KoBeWi/tween_pause()

Rémi Verschelde 3 سال پیش
والد
کامیت
a095c4bf65
4فایلهای تغییر یافته به همراه24 افزوده شده و 15 حذف شده
  1. 5 2
      doc/classes/Tween.xml
  2. 15 10
      scene/animation/tween.cpp
  3. 3 2
      scene/animation/tween.h
  4. 1 1
      scene/main/scene_tree.cpp

+ 5 - 2
doc/classes/Tween.xml

@@ -303,16 +303,19 @@
 	</signals>
 	<constants>
 		<constant name="TWEEN_PROCESS_PHYSICS" value="0" enum="TweenProcessMode">
-			The [Tween] updates during physics frame.
+			The [Tween] updates during the physics frame.
 		</constant>
 		<constant name="TWEEN_PROCESS_IDLE" value="1" enum="TweenProcessMode">
-			The [Tween] updates during idle
+			The [Tween] updates during the idle frame.
 		</constant>
 		<constant name="TWEEN_PAUSE_BOUND" value="0" enum="TweenPauseMode">
+			If the [Tween] has a bound node, it will process when that node can process (see [member Node.process_mode]). Otherwise it's the same as [constant TWEEN_PAUSE_STOP].
 		</constant>
 		<constant name="TWEEN_PAUSE_STOP" value="1" enum="TweenPauseMode">
+			If [SceneTree] is paused, the [Tween] will also pause.
 		</constant>
 		<constant name="TWEEN_PAUSE_PROCESS" value="2" enum="TweenPauseMode">
+			The [Tween] will process regardless of whether [SceneTree] is paused.
 		</constant>
 		<constant name="TRANS_LINEAR" value="0" enum="TransitionType">
 			The animation is interpolated linearly.

+ 15 - 10
scene/animation/tween.cpp

@@ -260,10 +260,8 @@ bool Tween::step(float p_delta) {
 	}
 
 	if (is_bound) {
-		Object *bound_instance = ObjectDB::get_instance(bound_node);
-		if (bound_instance) {
-			Node *bound_node = Object::cast_to<Node>(bound_instance);
-			// This can't by anything else than Node, so we can omit checking if casting succeeded.
+		Node *bound_node = get_bound_node();
+		if (bound_node) {
 			if (!bound_node->is_inside_tree()) {
 				return true;
 			}
@@ -320,16 +318,23 @@ bool Tween::step(float p_delta) {
 	return true;
 }
 
-bool Tween::should_pause() {
+bool Tween::can_process(bool p_tree_paused) const {
 	if (is_bound && pause_mode == TWEEN_PAUSE_BOUND) {
-		Object *bound_instance = ObjectDB::get_instance(bound_node);
-		if (bound_instance) {
-			Node *bound_node = Object::cast_to<Node>(bound_instance);
-			return !bound_node->can_process();
+		Node *bound_node = get_bound_node();
+		if (bound_node) {
+			return bound_node->can_process();
 		}
 	}
 
-	return pause_mode != TWEEN_PAUSE_PROCESS;
+	return !p_tree_paused || pause_mode == TWEEN_PAUSE_PROCESS;
+}
+
+Node *Tween::get_bound_node() const {
+	if (is_bound) {
+		return Object::cast_to<Node>(ObjectDB::get_instance(bound_node));
+	} else {
+		return nullptr;
+	}
 }
 
 real_t Tween::run_equation(TransitionType p_trans_type, EaseType p_ease_type, real_t p_time, real_t p_initial, real_t p_delta, real_t p_duration) {

+ 3 - 2
scene/animation/tween.h

@@ -97,7 +97,7 @@ public:
 
 private:
 	TweenProcessMode process_mode = TweenProcessMode::TWEEN_PROCESS_IDLE;
-	TweenPauseMode pause_mode = TweenPauseMode::TWEEN_PAUSE_STOP;
+	TweenPauseMode pause_mode = TweenPauseMode::TWEEN_PAUSE_BOUND;
 	TransitionType default_transition = TransitionType::TRANS_LINEAR;
 	EaseType default_ease = EaseType::EASE_IN_OUT;
 	ObjectID bound_node;
@@ -164,7 +164,8 @@ public:
 	Variant calculate_delta_value(Variant p_intial_val, Variant p_final_val);
 
 	bool step(float p_delta);
-	bool should_pause();
+	bool can_process(bool p_tree_paused) const;
+	Node *get_bound_node() const;
 
 	Tween() {}
 };

+ 1 - 1
scene/main/scene_tree.cpp

@@ -535,7 +535,7 @@ void SceneTree::process_tweens(float p_delta, bool p_physics) {
 	for (List<Ref<Tween>>::Element *E = tweens.front(); E;) {
 		List<Ref<Tween>>::Element *N = E->next();
 		// Don't process if paused or process mode doesn't match.
-		if ((paused && E->get()->should_pause()) || (p_physics == (E->get()->get_process_mode() == Tween::TWEEN_PROCESS_IDLE))) {
+		if (!E->get()->can_process(paused) || (p_physics == (E->get()->get_process_mode() == Tween::TWEEN_PROCESS_IDLE))) {
 			if (E == L) {
 				break;
 			}