diff --git a/doc/classes/Timer.xml b/doc/classes/Timer.xml index f8f9393847c6..00b2b039a07a 100644 --- a/doc/classes/Timer.xml +++ b/doc/classes/Timer.xml @@ -44,6 +44,8 @@ If [code]true[/code], the timer will start immediately when it enters the scene tree. [b]Note:[/b] After the timer enters the tree, this property is automatically set to [code]false[/code]. + + If [code]true[/code], the timer will stop after reaching the end. Otherwise, as by default, the timer will automatically restart. diff --git a/scene/main/timer.cpp b/scene/main/timer.cpp index 0f4f18b495ea..45fedfd105ef 100644 --- a/scene/main/timer.cpp +++ b/scene/main/timer.cpp @@ -48,7 +48,11 @@ void Timer::_notification(int p_what) { if (!processing || timer_process_callback == TIMER_PROCESS_PHYSICS || !is_processing_internal()) { return; } - time_left -= get_process_delta_time(); + if (ignore_time_scale) { + time_left -= Engine::get_singleton()->get_process_step(); + } else { + time_left -= get_process_delta_time(); + } if (time_left < 0) { if (!one_shot) { @@ -65,7 +69,11 @@ void Timer::_notification(int p_what) { if (!processing || timer_process_callback == TIMER_PROCESS_IDLE || !is_physics_processing_internal()) { return; } - time_left -= get_physics_process_delta_time(); + if (ignore_time_scale) { + time_left -= Engine::get_singleton()->get_process_step(); + } else { + time_left -= get_physics_process_delta_time(); + } if (time_left < 0) { if (!one_shot) { @@ -134,6 +142,14 @@ bool Timer::is_paused() const { return paused; } +void Timer::set_ignore_time_scale(bool p_ignore) { + ignore_time_scale = p_ignore; +} + +bool Timer::is_ignore_time_scale() { + return ignore_time_scale; +} + bool Timer::is_stopped() const { return get_time_left() <= 0; } @@ -206,6 +222,9 @@ void Timer::_bind_methods() { ClassDB::bind_method(D_METHOD("set_paused", "paused"), &Timer::set_paused); ClassDB::bind_method(D_METHOD("is_paused"), &Timer::is_paused); + ClassDB::bind_method(D_METHOD("set_ignore_time_scale", "ignore"), &Timer::set_ignore_time_scale); + ClassDB::bind_method(D_METHOD("is_ignore_time_scale"), &Timer::is_ignore_time_scale); + ClassDB::bind_method(D_METHOD("is_stopped"), &Timer::is_stopped); ClassDB::bind_method(D_METHOD("get_time_left"), &Timer::get_time_left); @@ -220,6 +239,7 @@ void Timer::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::BOOL, "one_shot"), "set_one_shot", "is_one_shot"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autostart"), "set_autostart", "has_autostart"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "paused", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_paused", "is_paused"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ignore_time_scale"), "set_ignore_time_scale", "is_ignore_time_scale"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_left", PROPERTY_HINT_NONE, "suffix:s", PROPERTY_USAGE_NONE), "", "get_time_left"); BIND_ENUM_CONSTANT(TIMER_PROCESS_PHYSICS); diff --git a/scene/main/timer.h b/scene/main/timer.h index d16e49793ddd..319a52f3669b 100644 --- a/scene/main/timer.h +++ b/scene/main/timer.h @@ -41,6 +41,7 @@ class Timer : public Node { bool autostart = false; bool processing = false; bool paused = false; + bool ignore_time_scale = false; double time_left = -1.0; @@ -69,6 +70,9 @@ class Timer : public Node { void set_paused(bool p_paused); bool is_paused() const; + void set_ignore_time_scale(bool p_ignore); + bool is_ignore_time_scale(); + bool is_stopped() const; double get_time_left() const;