Skip to content

Commit ec9e8f8

Browse files
Implemented set_time_left in Timer node. If new time_left is bigger than wait_time, sets wait_time value
1 parent 88b9932 commit ec9e8f8

File tree

3 files changed

+12
-3
lines changed

3 files changed

+12
-3
lines changed

doc/classes/Timer.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@
5858
<member name="process_callback" type="int" setter="set_timer_process_callback" getter="get_timer_process_callback" enum="Timer.TimerProcessCallback" default="1">
5959
Specifies when the timer is updated during the main loop.
6060
</member>
61-
<member name="time_left" type="float" setter="" getter="get_time_left">
61+
<member name="time_left" type="float" setter="set_time_left" getter="get_time_left">
6262
The timer's remaining time in seconds. This is always [code]0[/code] if the timer is stopped.
63-
[b]Note:[/b] This property is read-only and cannot be modified. It is based on [member wait_time].
63+
[b]Note:[/b] Setting this property when the timer is stopped pushes a warning message.
6464
</member>
6565
<member name="wait_time" type="float" setter="set_wait_time" getter="get_wait_time" default="1.0">
6666
The time required for the timer to end, in seconds. This property can also be set every time [method start] is called.

scene/main/timer.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,13 @@ double Timer::get_time_left() const {
158158
return time_left > 0 ? time_left : 0;
159159
}
160160

161+
void Timer::set_time_left(double p_time_left) {
162+
if (!processing) {
163+
ERR_FAIL_COND_MSG(!processing, vformat("Setting time_left when the timer is stopped. Use start(time_left) to start automatically"));
164+
}
165+
time_left = p_time_left > wait_time ? wait_time : p_time_left;
166+
}
167+
161168
void Timer::set_timer_process_callback(TimerProcessCallback p_callback) {
162169
if (timer_process_callback == p_callback) {
163170
return;
@@ -228,6 +235,7 @@ void Timer::_bind_methods() {
228235
ClassDB::bind_method(D_METHOD("is_stopped"), &Timer::is_stopped);
229236

230237
ClassDB::bind_method(D_METHOD("get_time_left"), &Timer::get_time_left);
238+
ClassDB::bind_method(D_METHOD("set_time_left", "time_left"), &Timer::set_time_left);
231239

232240
ClassDB::bind_method(D_METHOD("set_timer_process_callback", "callback"), &Timer::set_timer_process_callback);
233241
ClassDB::bind_method(D_METHOD("get_timer_process_callback"), &Timer::get_timer_process_callback);
@@ -240,7 +248,7 @@ void Timer::_bind_methods() {
240248
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autostart"), "set_autostart", "has_autostart");
241249
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "paused", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_paused", "is_paused");
242250
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ignore_time_scale"), "set_ignore_time_scale", "is_ignoring_time_scale");
243-
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_left", PROPERTY_HINT_NONE, "suffix:s", PROPERTY_USAGE_NONE), "", "get_time_left");
251+
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "time_left", PROPERTY_HINT_NONE, "suffix:s", PROPERTY_USAGE_NONE), "set_time_left", "get_time_left");
244252

245253
BIND_ENUM_CONSTANT(TIMER_PROCESS_PHYSICS);
246254
BIND_ENUM_CONSTANT(TIMER_PROCESS_IDLE);

scene/main/timer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class Timer : public Node {
7575
bool is_stopped() const;
7676

7777
double get_time_left() const;
78+
void set_time_left(double p_time_left);
7879

7980
PackedStringArray get_configuration_warnings() const override;
8081

0 commit comments

Comments
 (0)