소스 검색

Block Tween custom_step() during step

kobewi 1 개월 전
부모
커밋
b615c7b3db
2개의 변경된 파일8개의 추가작업 그리고 2개의 파일을 삭제
  1. 7 2
      scene/animation/tween.cpp
  2. 1 0
      scene/animation/tween.h

+ 7 - 2
scene/animation/tween.cpp

@@ -303,6 +303,8 @@ Ref<Tween> Tween::chain() {
 }
 
 bool Tween::custom_step(double p_delta) {
+	ERR_FAIL_COND_V_MSG(in_step, true, "Can't call custom_step() during another Tween step.");
+
 	bool r = running;
 	running = true;
 	bool ret = step(p_delta);
@@ -329,6 +331,7 @@ bool Tween::step(double p_delta) {
 	if (!running) {
 		return true;
 	}
+	in_step = true;
 
 	if (!started) {
 		if (tweeners.is_empty()) {
@@ -339,6 +342,7 @@ bool Tween::step(double p_delta) {
 			} else {
 				tween_id = to_string();
 			}
+			in_step = false;
 			ERR_FAIL_V_MSG(false, tween_id + ": started with no Tweeners.");
 		}
 		current_step = 0;
@@ -357,7 +361,7 @@ bool Tween::step(double p_delta) {
 	bool potential_infinite = false;
 #endif
 
-	while (rem_delta > 0 && running) {
+	while (running && rem_delta > 0) {
 		double step_delta = rem_delta;
 		step_active = false;
 
@@ -392,6 +396,7 @@ bool Tween::step(double p_delta) {
 							potential_infinite = true;
 						} else {
 							// Looped twice without using any time, this is 100% certain infinite loop.
+							in_step = false;
 							ERR_FAIL_V_MSG(false, "Infinite loop detected. Check set_loops() description for more info.");
 						}
 					}
@@ -402,7 +407,7 @@ bool Tween::step(double p_delta) {
 			}
 		}
 	}
-
+	in_step = false;
 	return true;
 }
 

+ 1 - 0
scene/animation/tween.h

@@ -122,6 +122,7 @@ private:
 	bool is_bound = false;
 	bool started = false;
 	bool running = true;
+	bool in_step = false;
 	bool dead = false;
 	bool valid = false;
 	bool default_parallel = false;