mirror of
https://github.com/godotengine/godot.git
synced 2025-02-17 22:43:01 +08:00
Check "done" state in original loop
My first attepmt I added a second loop to check if processing should stop. This attempts to optimize by using the original loop (one loop). Also resets `elapsed` time on finish of tween which fixes `tell()`.
This commit is contained in:
parent
5c914e2d5b
commit
07874292d0
@ -521,8 +521,8 @@ void Tween::_tween_process(float p_delta) {
|
||||
|
||||
pending_update++;
|
||||
// if repeat and all interpolates was finished then reset all interpolates
|
||||
bool all_finished = true;
|
||||
if (repeat) {
|
||||
bool all_finished = true;
|
||||
|
||||
for (List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) {
|
||||
|
||||
@ -538,9 +538,12 @@ void Tween::_tween_process(float p_delta) {
|
||||
reset_all();
|
||||
}
|
||||
|
||||
all_finished = true;
|
||||
for (List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) {
|
||||
|
||||
InterpolateData &data = E->get();
|
||||
all_finished = all_finished && data.finish;
|
||||
|
||||
if (!data.active || data.finish)
|
||||
continue;
|
||||
|
||||
@ -554,8 +557,8 @@ void Tween::_tween_process(float p_delta) {
|
||||
continue;
|
||||
else if (prev_delaying) {
|
||||
|
||||
emit_signal("tween_started", object, NodePath(Vector<StringName>(), data.key, false));
|
||||
_apply_tween_value(data, data.initial_val);
|
||||
emit_signal("tween_started", object, NodePath(Vector<StringName>(), data.key, false));
|
||||
}
|
||||
|
||||
if (data.elapsed > (data.delay + data.duration)) {
|
||||
@ -608,29 +611,18 @@ void Tween::_tween_process(float p_delta) {
|
||||
|
||||
if (data.finish) {
|
||||
_apply_tween_value(data, data.final_val);
|
||||
data.elapsed = 0;
|
||||
emit_signal("tween_completed", object, NodePath(Vector<StringName>(), data.key, false));
|
||||
// not repeat mode, remove completed action
|
||||
if (!repeat)
|
||||
call_deferred("_remove", object, NodePath(Vector<StringName>(), data.key, false), true);
|
||||
}
|
||||
} else if (!repeat)
|
||||
all_finished = all_finished && data.finish;
|
||||
}
|
||||
pending_update--;
|
||||
|
||||
if (!repeat) {
|
||||
bool all_finished = true;
|
||||
for (List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) {
|
||||
|
||||
InterpolateData &data = E->get();
|
||||
|
||||
if (data.finish == false) {
|
||||
all_finished = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (all_finished)
|
||||
set_active(false);
|
||||
}
|
||||
if (all_finished)
|
||||
set_active(false);
|
||||
}
|
||||
|
||||
void Tween::set_tween_process_mode(TweenProcessMode p_mode) {
|
||||
|
Loading…
Reference in New Issue
Block a user