소스 검색

Improvements to Tweens' Variant types

kobewi 4 년 전
부모
커밋
266955d15f
3개의 변경된 파일19개의 추가작업 그리고 14개의 파일을 삭제
  1. 8 10
      doc/classes/Tween.xml
  2. 9 2
      scene/animation/tween.cpp
  3. 2 2
      scene/animation/tween.h

+ 8 - 10
doc/classes/Tween.xml

@@ -58,8 +58,8 @@
 				[codeblock]
 				var tween = create_tween().set_parallel(true)
 				tween.tween_property(...)
-				tween.tween_property(...) #will run parallelly with above
-				tween.chain().tween_property(...) #will run after two above are finished
+				tween.tween_property(...) # Will run parallelly with above.
+				tween.chain().tween_property(...) # Will run after two above are finished.
 				[/codeblock]
 			</description>
 		</method>
@@ -215,11 +215,9 @@
 				Creates and appends an [IntervalTweener]. This method can be used to create delays in the tween animation, as an alternative for using the delay in other [Tweener]s or when there's no animation (in which case the [Tween] acts as a timer). [code]time[/code] is the length of the interval, in seconds.
 				Example: creating an interval in code execution.
 				[codeblock]
-				#... some code
-				var tween = create_tween()
-				tween.tween_interval(2)
-				await tween.finished
-				#... more code
+				# ... some code
+				await create_tween().tween_interval(2).finished
+				# ... more code
 				[/codeblock]
 				Example: creating an object that moves back and forth and jumps every few seconds.
 				[codeblock]
@@ -236,15 +234,15 @@
 		<method name="tween_method">
 			<return type="MethodTweener" />
 			<argument index="0" name="method" type="Callable" />
-			<argument index="1" name="from" type="float" />
-			<argument index="2" name="to" type="float" />
+			<argument index="1" name="from" type="Variant" />
+			<argument index="2" name="to" type="Variant" />
 			<argument index="3" name="duration" type="float" />
 			<description>
 				Creates and appends a [MethodTweener]. This method is similar to a combination of [method tween_callback] and [method tween_property]. It calls a method over time with a tweened value provided as an argument. The value is tweened between [code]from[/code] and [code]to[/code] over the time specified by [code]duration[/code], in seconds. Use [method Callable.bind] to bind additional arguments for the call. You can use [method MethodTweener.set_ease] and [method MethodTweener.set_trans] to tweak the easing and transition of the value or [method MethodTweener.set_delay] to delay the tweening.
 				Example: making a 3D object look from one point to another point.
 				[codeblock]
 				var tween = create_tween()
-				tween.tween_method(look_at.bind(Vector3.UP), Vector3(-1, 0, -1), Vector3(1, 0, -1), 1) #the look_at() method takes up vector as second argument
+				tween.tween_method(look_at.bind(Vector3.UP), Vector3(-1, 0, -1), Vector3(1, 0, -1), 1) # The look_at() method takes up vector as second argument.
 				[/codeblock]
 				Example: setting a text of a [Label], using an intermediate method and after a delay.
 				[codeblock]

+ 9 - 2
scene/animation/tween.cpp

@@ -60,6 +60,11 @@ Ref<PropertyTweener> Tween::tween_property(Object *p_target, NodePath p_property
 	ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
 	ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
 
+#ifdef DEBUG_ENABLED
+	Variant::Type property_type = p_target->get_indexed(p_property.get_as_property_path().get_subnames()).get_type();
+	ERR_FAIL_COND_V_MSG(property_type != p_to.get_type(), Ref<PropertyTweener>(), "Type mismatch between property and final value: " + Variant::get_type_name(property_type) + " and " + Variant::get_type_name(p_to.get_type()));
+#endif
+
 	Ref<PropertyTweener> tweener = memnew(PropertyTweener(p_target, p_property, p_to, p_duration));
 	append(tweener);
 	return tweener;
@@ -83,7 +88,7 @@ Ref<CallbackTweener> Tween::tween_callback(Callable p_callback) {
 	return tweener;
 }
 
-Ref<MethodTweener> Tween::tween_method(Callable p_callback, float p_from, float p_to, float p_duration) {
+Ref<MethodTweener> Tween::tween_method(Callable p_callback, Variant p_from, Variant p_to, float p_duration) {
 	ERR_FAIL_COND_V_MSG(!valid, nullptr, "Tween invalid. Either finished or created outside scene tree.");
 	ERR_FAIL_COND_V_MSG(started, nullptr, "Can't append to a Tween that has started. Use stop() first.");
 
@@ -496,6 +501,8 @@ Variant Tween::interpolate_variant(Variant p_initial_val, Variant p_delta_val, f
 }
 
 Variant Tween::calculate_delta_value(Variant p_intial_val, Variant p_final_val) {
+	ERR_FAIL_COND_V_MSG(p_intial_val.get_type() != p_final_val.get_type(), p_intial_val, "Type mismatch between initial and final value: " + Variant::get_type_name(p_intial_val.get_type()) + " and " + Variant::get_type_name(p_final_val.get_type()));
+
 	switch (p_intial_val.get_type()) {
 		case Variant::BOOL: {
 			return (int)p_final_val - (int)p_intial_val;
@@ -888,7 +895,7 @@ void MethodTweener::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_ease", "ease"), &MethodTweener::set_ease);
 }
 
-MethodTweener::MethodTweener(Callable p_callback, float p_from, float p_to, float p_duration) {
+MethodTweener::MethodTweener(Callable p_callback, Variant p_from, Variant p_to, float p_duration) {
 	callback = p_callback;
 	initial_val = p_from;
 	delta_val = tween->calculate_delta_value(p_from, p_to);

+ 2 - 2
scene/animation/tween.h

@@ -128,7 +128,7 @@ public:
 	Ref<PropertyTweener> tween_property(Object *p_target, NodePath p_property, Variant p_to, float p_duration);
 	Ref<IntervalTweener> tween_interval(float p_time);
 	Ref<CallbackTweener> tween_callback(Callable p_callback);
-	Ref<MethodTweener> tween_method(Callable p_callback, float p_from, float p_to, float p_duration);
+	Ref<MethodTweener> tween_method(Callable p_callback, Variant p_from, Variant p_to, float p_duration);
 	void append(Ref<Tweener> p_tweener);
 
 	bool custom_step(float p_delta);
@@ -258,7 +258,7 @@ public:
 	void start() override;
 	bool step(float &r_delta) override;
 
-	MethodTweener(Callable p_callback, float p_from, float p_to, float p_duration);
+	MethodTweener(Callable p_callback, Variant p_from, Variant p_to, float p_duration);
 	MethodTweener();
 
 protected: