summaryrefslogtreecommitdiff
path: root/scene/animation
diff options
context:
space:
mode:
authorsanikoyes <sanikoyes@163.com>2014-08-21 15:34:16 +0800
committersanikoyes <sanikoyes@163.com>2014-08-21 15:34:16 +0800
commit5668cec030e67a89994a97db06ca7101ab9be272 (patch)
tree95a8e4597e2d1fc9024da088a70a364064dd2fb3 /scene/animation
parent1c0ac4ee45bf197152bc2bd6cf436a155b72f309 (diff)
Add tween delay support
Add tween get_runtime function Update demo for tween delay sample
Diffstat (limited to 'scene/animation')
-rw-r--r--scene/animation/tween.cpp75
-rw-r--r--scene/animation/tween.h5
2 files changed, 66 insertions, 14 deletions
diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp
index cdd9176a1b..48a2fd564b 100644
--- a/scene/animation/tween.cpp
+++ b/scene/animation/tween.cpp
@@ -132,9 +132,10 @@ void Tween::_bind_methods() {
ObjectTypeDB::bind_method(_MD("remove","object","key"),&Tween::remove );
ObjectTypeDB::bind_method(_MD("remove_all"),&Tween::remove_all );
ObjectTypeDB::bind_method(_MD("seek"),&Tween::seek );
+ ObjectTypeDB::bind_method(_MD("get_runtime"),&Tween::get_runtime );
- ObjectTypeDB::bind_method(_MD("interpolate_property","object","property","initial_val","final_val","times_in_sec","trans_type","ease_type"),&Tween::interpolate_property );
- ObjectTypeDB::bind_method(_MD("interpolate_method","object","method","initial_val","final_val","times_in_sec","trans_type","ease_type"),&Tween::interpolate_method );
+ ObjectTypeDB::bind_method(_MD("interpolate_property","object","property","initial_val","final_val","times_in_sec","trans_type","ease_type","delay"),&Tween::interpolate_property, DEFVAL(0) );
+ ObjectTypeDB::bind_method(_MD("interpolate_method","object","method","initial_val","final_val","times_in_sec","trans_type","ease_type","delay"),&Tween::interpolate_method, DEFVAL(0) );
ADD_SIGNAL( MethodInfo("tween_start", PropertyInfo( Variant::OBJECT,"object"), PropertyInfo( Variant::STRING,"key")) );
ADD_SIGNAL( MethodInfo("tween_step", PropertyInfo( Variant::OBJECT,"object"), PropertyInfo( Variant::STRING,"key"), PropertyInfo( Variant::REAL,"elapsed"), PropertyInfo( Variant::OBJECT,"value")) );
@@ -168,16 +169,16 @@ Variant Tween::_run_equation(InterpolateData& p_data) {
Variant result;
#define APPLY_EQUATION(element)\
- r.element = _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed, i.element, d.element, p_data.times_in_sec);
+ r.element = _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed - p_data.delay, i.element, d.element, p_data.times_in_sec);
switch(initial_val.get_type())
{
case Variant::INT:
- result = (int) _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed, (int) initial_val, (int) delta_val, p_data.times_in_sec);
+ result = (int) _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed - p_data.delay, (int) initial_val, (int) delta_val, p_data.times_in_sec);
break;
case Variant::REAL:
- result = _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed, (real_t) initial_val, (real_t) delta_val, p_data.times_in_sec);
+ result = _run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed - p_data.delay, (real_t) initial_val, (real_t) delta_val, p_data.times_in_sec);
break;
case Variant::VECTOR2:
@@ -350,26 +351,33 @@ void Tween::_tween_process(float p_delta) {
InterpolateData& data = E->get();
if(!data.active)
continue;
- if(data.elapsed == data.times_in_sec) {
+ if(data.finish) {
if(!repeat)
continue;
data.elapsed = 0;
+ data.finish = false;
}
- if(data.elapsed == 0)
+ bool prev_delaying = data.elapsed <= data.delay;
+ data.elapsed += p_delta;
+ if(data.elapsed < data.delay)
+ continue;
+ else if(prev_delaying)
emit_signal("tween_start",data.object,data.key);
- data.elapsed += p_delta;
- if(data.elapsed > data.times_in_sec)
- data.elapsed = data.times_in_sec;
+ if(data.elapsed > (data.delay + data.times_in_sec)) {
+
+ data.elapsed = data.delay + data.times_in_sec;
+ data.finish = true;
+ }
Variant result = _run_equation(data);
emit_signal("tween_step",data.object,data.key,data.elapsed,result);
_apply_tween_value(data, result);
- if(data.elapsed == data.times_in_sec)
+ if(data.finish)
emit_signal("tween_complete",data.object,data.key);
}
}
@@ -452,8 +460,12 @@ bool Tween::reset(Variant p_object, String p_key) {
for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
InterpolateData& data = E->get();
- if(data.object == p_object && data.key == p_key)
+ if(data.object == p_object && data.key == p_key) {
+
+ data.elapsed = 0;
+ data.finish = false;
_apply_tween_value(data, data.initial_val);
+ }
}
return true;
}
@@ -463,6 +475,8 @@ bool Tween::reset_all() {
for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
InterpolateData& data = E->get();
+ data.elapsed = 0;
+ data.finish = false;
_apply_tween_value(data, data.initial_val);
}
return true;
@@ -548,8 +562,10 @@ bool Tween::seek(real_t p_time) {
InterpolateData& data = E->get();
data.elapsed = p_time;
- if(data.elapsed > data.times_in_sec)
- data.elapsed = data.times_in_sec;
+ if(data.elapsed < data.delay)
+ continue;
+ else if(data.elapsed > (data.delay + data.times_in_sec))
+ data.elapsed = (data.delay + data.times_in_sec);
Variant result = _run_equation(data);
@@ -558,6 +574,19 @@ bool Tween::seek(real_t p_time) {
return true;
}
+real_t Tween::get_runtime() {
+
+ real_t runtime = 0;
+ for(List<InterpolateData>::Element *E=interpolates.front();E;E=E->next()) {
+
+ InterpolateData& data = E->get();
+ real_t t = data.delay + data.times_in_sec;
+ if(t > runtime)
+ runtime = t;
+ }
+ return runtime;
+}
+
bool Tween::_calc_delta_val(InterpolateData& p_data) {
Variant& initial_val = p_data.initial_val;
@@ -666,11 +695,18 @@ bool Tween::interpolate_property(Variant p_object
, real_t p_times_in_sec
, TransitionType p_trans_type
, EaseType p_ease_type
+ , real_t p_delay
) {
+ // convert INT to REAL is better for interpolaters
+ if(p_initial_val.get_type() == Variant::INT) p_initial_val = p_initial_val.operator real_t();
+ if(p_final_val.get_type() == Variant::INT) p_final_val = p_final_val.operator real_t();
ERR_FAIL_COND_V(p_object.get_type() != Variant::OBJECT, false);
ERR_FAIL_COND_V(p_initial_val.get_type() != p_final_val.get_type(), false);
ERR_FAIL_COND_V(p_times_in_sec <= 0, false);
+ ERR_FAIL_COND_V(p_trans_type < 0 || p_trans_type >= TRANS_COUNT, false);
+ ERR_FAIL_COND_V(p_ease_type < 0 || p_ease_type >= EASE_COUNT, false);
+ ERR_FAIL_COND_V(p_delay < 0, false);
bool prop_found = false;
Object *obj = (Object *) p_object;
@@ -690,6 +726,7 @@ bool Tween::interpolate_property(Variant p_object
InterpolateData data;
data.active = true;
data.is_method = false;
+ data.finish = false;
data.elapsed = 0;
data.object = p_object;
@@ -699,6 +736,7 @@ bool Tween::interpolate_property(Variant p_object
data.times_in_sec = p_times_in_sec;
data.trans_type = p_trans_type;
data.ease_type = p_ease_type;
+ data.delay = p_delay;
if(!_calc_delta_val(data))
return false;
@@ -714,11 +752,18 @@ bool Tween::interpolate_method(Variant p_object
, real_t p_times_in_sec
, TransitionType p_trans_type
, EaseType p_ease_type
+ , real_t p_delay
) {
+ // convert INT to REAL is better for interpolaters
+ if(p_initial_val.get_type() == Variant::INT) p_initial_val = p_initial_val.operator real_t();
+ if(p_final_val.get_type() == Variant::INT) p_final_val = p_final_val.operator real_t();
ERR_FAIL_COND_V(p_object.get_type() != Variant::OBJECT, false);
ERR_FAIL_COND_V(p_initial_val.get_type() != p_final_val.get_type(), false);
ERR_FAIL_COND_V(p_times_in_sec <= 0, false);
+ ERR_FAIL_COND_V(p_trans_type < 0 || p_trans_type >= TRANS_COUNT, false);
+ ERR_FAIL_COND_V(p_ease_type < 0 || p_ease_type >= EASE_COUNT, false);
+ ERR_FAIL_COND_V(p_delay < 0, false);
Object *obj = (Object *) p_object;
ERR_FAIL_COND_V(!obj->has_method(p_method), false);
@@ -726,6 +771,7 @@ bool Tween::interpolate_method(Variant p_object
InterpolateData data;
data.active = true;
data.is_method = true;
+ data.finish = false;
data.elapsed = 0;
data.object = p_object;
@@ -735,6 +781,7 @@ bool Tween::interpolate_method(Variant p_object
data.times_in_sec = p_times_in_sec;
data.trans_type = p_trans_type;
data.ease_type = p_ease_type;
+ data.delay = p_delay;
if(!_calc_delta_val(data))
return false;
diff --git a/scene/animation/tween.h b/scene/animation/tween.h
index 7dd917dc8e..78df7d9c93 100644
--- a/scene/animation/tween.h
+++ b/scene/animation/tween.h
@@ -72,6 +72,7 @@ private:
struct InterpolateData {
bool active;
bool is_method;
+ bool finish;
real_t elapsed;
Variant object;
@@ -82,6 +83,7 @@ private:
real_t times_in_sec;
TransitionType trans_type;
EaseType ease_type;
+ real_t delay;
};
String autoplay;
@@ -138,6 +140,7 @@ public:
bool remove_all();
bool seek(real_t p_time);
+ real_t get_runtime();
bool interpolate_property(Variant p_object
, String p_property
@@ -146,6 +149,7 @@ public:
, real_t p_times_in_sec
, TransitionType p_trans_type
, EaseType p_ease_type
+ , real_t p_delay = 0
);
bool interpolate_method(Variant p_object
@@ -155,6 +159,7 @@ public:
, real_t p_times_in_sec
, TransitionType p_trans_type
, EaseType p_ease_type
+ , real_t p_delay = 0
);
Tween();