Make Tween.interpolate_value() static

This commit is contained in:
kobewi 2022-04-17 23:13:39 +02:00
parent 690fefe43e
commit 3017530e26
5 changed files with 18 additions and 16 deletions

View file

@ -266,7 +266,7 @@
- Greater than 1.0 (exclusive): Ease in - Greater than 1.0 (exclusive): Ease in
[/codeblock] [/codeblock]
[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/ease_cheatsheet.png]ease() curve values cheatsheet[/url] [url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/ease_cheatsheet.png]ease() curve values cheatsheet[/url]
See also [method smoothstep]. If you need to perform more advanced transitions, use [Tween] or [AnimationPlayer]. See also [method smoothstep]. If you need to perform more advanced transitions, use [method Tween.interpolate_value].
</description> </description>
</method> </method>
<method name="error_string"> <method name="error_string">

View file

@ -6,7 +6,7 @@
<description> <description>
Tweens are mostly useful for animations requiring a numerical property to be interpolated over a range of values. The name [i]tween[/i] comes from [i]in-betweening[/i], an animation technique where you specify [i]keyframes[/i] and the computer interpolates the frames that appear between them. Tweens are mostly useful for animations requiring a numerical property to be interpolated over a range of values. The name [i]tween[/i] comes from [i]in-betweening[/i], an animation technique where you specify [i]keyframes[/i] and the computer interpolates the frames that appear between them.
[Tween] is more suited than [AnimationPlayer] for animations where you don't know the final values in advance. For example, interpolating a dynamically-chosen camera zoom value is best done with a [Tween]; it would be difficult to do the same thing with an [AnimationPlayer] node. Tweens are also more light-weight than [AnimationPlayer], so they are very much suited for simple animations or general tasks that don't require visual tweaking provided by the editor. They can be used in a fire-and-forget manner for some logic that normally would be done by code. You can e.g. make something shoot periodically by using a looped [CallbackTweener] with a delay. [Tween] is more suited than [AnimationPlayer] for animations where you don't know the final values in advance. For example, interpolating a dynamically-chosen camera zoom value is best done with a [Tween]; it would be difficult to do the same thing with an [AnimationPlayer] node. Tweens are also more light-weight than [AnimationPlayer], so they are very much suited for simple animations or general tasks that don't require visual tweaking provided by the editor. They can be used in a fire-and-forget manner for some logic that normally would be done by code. You can e.g. make something shoot periodically by using a looped [CallbackTweener] with a delay.
A [Tween] can be created by using either [method SceneTree.create_tween] or [method Node.create_tween]. [Tween]s created manually (i.e. by using [code]Tween.new()[/code]) are invalid. They can't be used for tweening values, but you can do manual interpolation with [method interpolate_value]. A [Tween] can be created by using either [method SceneTree.create_tween] or [method Node.create_tween]. [Tween]s created manually (i.e. by using [code]Tween.new()[/code]) are invalid and can't be used for tweening values.
A [Tween] animation is composed of a sequence of [Tweener]s, which by default are executed one after another. You can create a sequence by appending [Tweener]s to the [Tween]. Animating something with a [Tweener] is called tweening. Example tweening sequence looks like this: A [Tween] animation is composed of a sequence of [Tweener]s, which by default are executed one after another. You can create a sequence by appending [Tweener]s to the [Tween]. Animating something with a [Tweener] is called tweening. Example tweening sequence looks like this:
[codeblock] [codeblock]
var tween = get_tree().create_tween() var tween = get_tree().create_tween()
@ -79,7 +79,7 @@
[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. [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> </description>
</method> </method>
<method name="interpolate_value"> <method name="interpolate_value" qualifiers="static">
<return type="Variant" /> <return type="Variant" />
<argument index="0" name="initial_value" type="Variant" /> <argument index="0" name="initial_value" type="Variant" />
<argument index="1" name="delta_value" type="Variant" /> <argument index="1" name="delta_value" type="Variant" />
@ -105,7 +105,7 @@
<method name="is_valid"> <method name="is_valid">
<return type="bool" /> <return type="bool" />
<description> <description>
Returns whether the [Tween] is valid. A valid [Tween] is a [Tween] contained by the scene tree (i.e. the array from [method SceneTree.get_processed_tweens] will contain this [Tween]). [Tween] might become invalid when it has finished tweening or was killed, also when created with [code]Tween.new()[/code]. Invalid [Tween] can't have [Tweener]s appended, because it can't animate them. You can however still use [method interpolate_value]. Returns whether the [Tween] is valid. A valid [Tween] is a [Tween] contained by the scene tree (i.e. the array from [method SceneTree.get_processed_tweens] will contain this [Tween]). [Tween] might become invalid when it has finished tweening or was killed, also when created with [code]Tween.new()[/code]. Invalid [Tween] can't have [Tweener]s appended, because it can't animate them.
</description> </description>
</method> </method>
<method name="kill"> <method name="kill">

View file

@ -152,10 +152,6 @@ bool Tween::is_running() {
return running; return running;
} }
void Tween::set_valid(bool p_valid) {
valid = p_valid;
}
bool Tween::is_valid() { bool Tween::is_valid() {
return valid; return valid;
} }
@ -648,7 +644,7 @@ void Tween::_bind_methods() {
ClassDB::bind_method(D_METHOD("parallel"), &Tween::parallel); ClassDB::bind_method(D_METHOD("parallel"), &Tween::parallel);
ClassDB::bind_method(D_METHOD("chain"), &Tween::chain); ClassDB::bind_method(D_METHOD("chain"), &Tween::chain);
ClassDB::bind_method(D_METHOD("interpolate_value", "initial_value", "delta_value", "elapsed_time", "duration", "trans_type", "ease_type"), &Tween::interpolate_variant); ClassDB::bind_static_method("Tween", D_METHOD("interpolate_value", "initial_value", "delta_value", "elapsed_time", "duration", "trans_type", "ease_type"), &Tween::interpolate_variant);
ADD_SIGNAL(MethodInfo("step_finished", PropertyInfo(Variant::INT, "idx"))); ADD_SIGNAL(MethodInfo("step_finished", PropertyInfo(Variant::INT, "idx")));
ADD_SIGNAL(MethodInfo("loop_finished", PropertyInfo(Variant::INT, "loop_count"))); ADD_SIGNAL(MethodInfo("loop_finished", PropertyInfo(Variant::INT, "loop_count")));
@ -679,6 +675,14 @@ void Tween::_bind_methods() {
BIND_ENUM_CONSTANT(EASE_OUT_IN); BIND_ENUM_CONSTANT(EASE_OUT_IN);
} }
Tween::Tween() {
ERR_FAIL_MSG("Tween can't be created directly. Use create_tween() method.");
}
Tween::Tween(bool p_valid) {
valid = p_valid;
}
Ref<PropertyTweener> PropertyTweener::from(Variant p_value) { Ref<PropertyTweener> PropertyTweener::from(Variant p_value) {
initial_val = p_value; initial_val = p_value;
do_continue = false; do_continue = false;

View file

@ -139,7 +139,6 @@ public:
void kill(); void kill();
bool is_running(); bool is_running();
void set_valid(bool p_valid);
bool is_valid(); bool is_valid();
void clear(); void clear();
@ -160,8 +159,8 @@ public:
Ref<Tween> parallel(); Ref<Tween> parallel();
Ref<Tween> chain(); Ref<Tween> chain();
real_t run_equation(TransitionType p_trans_type, EaseType p_ease_type, real_t t, real_t b, real_t c, real_t d); static real_t run_equation(TransitionType p_trans_type, EaseType p_ease_type, real_t t, real_t b, real_t c, real_t d);
Variant interpolate_variant(Variant p_initial_val, Variant p_delta_val, float p_time, float p_duration, Tween::TransitionType p_trans, Tween::EaseType p_ease); static Variant interpolate_variant(Variant p_initial_val, Variant p_delta_val, float p_time, float p_duration, Tween::TransitionType p_trans, Tween::EaseType p_ease);
Variant calculate_delta_value(Variant p_intial_val, Variant p_final_val); Variant calculate_delta_value(Variant p_intial_val, Variant p_final_val);
bool step(float p_delta); bool step(float p_delta);
@ -169,7 +168,8 @@ public:
Node *get_bound_node() const; Node *get_bound_node() const;
float get_total_time() const; float get_total_time() const;
Tween() {} Tween();
Tween(bool p_valid);
}; };
VARIANT_ENUM_CAST(Tween::TweenPauseMode); VARIANT_ENUM_CAST(Tween::TweenPauseMode);

View file

@ -1113,9 +1113,7 @@ Ref<SceneTreeTimer> SceneTree::create_timer(double p_delay_sec, bool p_process_a
} }
Ref<Tween> SceneTree::create_tween() { Ref<Tween> SceneTree::create_tween() {
Ref<Tween> tween; Ref<Tween> tween = memnew(Tween(true));
tween.instantiate();
tween->set_valid(true);
tweens.push_back(tween); tweens.push_back(tween);
return tween; return tween;
} }