瀏覽代碼

Merge pull request #59415 from KoBeWi/tween_time()

Rémi Verschelde 3 年之前
父節點
當前提交
6bbd4def45
共有 3 個文件被更改,包括 17 次插入0 次删除
  1. 7 0
      doc/classes/Tween.xml
  2. 8 0
      scene/animation/tween.cpp
  3. 2 0
      scene/animation/tween.h

+ 7 - 0
doc/classes/Tween.xml

@@ -72,6 +72,13 @@
 				[b]Note:[/b] The [Tween] will become invalid after finished, but you can call [method stop] after the step, to keep it and reset.
 			</description>
 		</method>
+		<method name="get_total_elapsed_time" qualifiers="const">
+			<return type="float" />
+			<description>
+				Returns the total time in seconds the [Tween] has been animating (i.e. time since it started, not counting pauses etc.). The time is affected by [method set_speed_scale] and [method stop] will reset it to [code]0[/code].
+				[b]Note:[/code] As it results from accumulating frame deltas, the time returned after the [Tween] has finished animating will be slightly greater than the actual [Tween] duration.
+			</description>
+		</method>
 		<method name="interpolate_value">
 			<return type="Variant" />
 			<argument index="0" name="initial_value" type="Variant" />

+ 8 - 0
scene/animation/tween.cpp

@@ -130,6 +130,7 @@ void Tween::stop() {
 	started = false;
 	running = false;
 	dead = false;
+	total_time = 0;
 }
 
 void Tween::pause() {
@@ -272,12 +273,14 @@ bool Tween::step(float p_delta) {
 		ERR_FAIL_COND_V_MSG(tweeners.is_empty(), false, "Tween started, but has no Tweeners.");
 		current_step = 0;
 		loops_done = 0;
+		total_time = 0;
 		start_tweeners();
 		started = true;
 	}
 
 	float rem_delta = p_delta * speed_scale;
 	bool step_active = false;
+	total_time += rem_delta;
 
 	while (rem_delta > 0 && running) {
 		float step_delta = rem_delta;
@@ -346,6 +349,10 @@ Node *Tween::get_bound_node() const {
 	}
 }
 
+float Tween::get_total_time() const {
+	return total_time;
+}
+
 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) {
 	if (p_duration == 0) {
 		// Special case to avoid dividing by 0 in equations.
@@ -624,6 +631,7 @@ void Tween::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("pause"), &Tween::pause);
 	ClassDB::bind_method(D_METHOD("play"), &Tween::play);
 	ClassDB::bind_method(D_METHOD("kill"), &Tween::kill);
+	ClassDB::bind_method(D_METHOD("get_total_elapsed_time"), &Tween::get_total_time);
 
 	ClassDB::bind_method(D_METHOD("is_running"), &Tween::is_running);
 	ClassDB::bind_method(D_METHOD("is_valid"), &Tween::is_valid);

+ 2 - 0
scene/animation/tween.h

@@ -103,6 +103,7 @@ private:
 	ObjectID bound_node;
 
 	Vector<List<Ref<Tweener>>> tweeners;
+	float total_time = 0;
 	int current_step = -1;
 	int loops = 1;
 	int loops_done = 0;
@@ -166,6 +167,7 @@ public:
 	bool step(float p_delta);
 	bool can_process(bool p_tree_paused) const;
 	Node *get_bound_node() const;
+	float get_total_time() const;
 
 	Tween() {}
 };