@@ -15,7 +15,7 @@ pub struct Timer {
15
15
duration : Duration ,
16
16
repeating : bool ,
17
17
finished : bool ,
18
- times_finished : u32 ,
18
+ times_finished_this_tick : u32 ,
19
19
}
20
20
21
21
impl Timer {
@@ -76,7 +76,7 @@ impl Timer {
76
76
/// ```
77
77
#[ inline]
78
78
pub fn just_finished ( & self ) -> bool {
79
- self . times_finished > 0
79
+ self . times_finished_this_tick > 0
80
80
}
81
81
82
82
/// Returns the time elapsed on the timer. Guaranteed to be between 0.0 and `duration`.
@@ -202,11 +202,15 @@ impl Timer {
202
202
/// ```
203
203
pub fn tick ( & mut self , delta : Duration ) -> & Self {
204
204
if self . paused ( ) {
205
+ self . times_finished_this_tick = 0 ;
206
+ if self . repeating ( ) {
207
+ self . finished = false ;
208
+ }
205
209
return self ;
206
210
}
207
211
208
212
if !self . repeating ( ) && self . finished ( ) {
209
- self . times_finished = 0 ;
213
+ self . times_finished_this_tick = 0 ;
210
214
return self ;
211
215
}
212
216
@@ -215,16 +219,16 @@ impl Timer {
215
219
216
220
if self . finished ( ) {
217
221
if self . repeating ( ) {
218
- self . times_finished =
222
+ self . times_finished_this_tick =
219
223
( self . elapsed ( ) . as_nanos ( ) / self . duration ( ) . as_nanos ( ) ) as u32 ;
220
224
// Duration does not have a modulo
221
- self . set_elapsed ( self . elapsed ( ) - self . duration ( ) * self . times_finished ) ;
225
+ self . set_elapsed ( self . elapsed ( ) - self . duration ( ) * self . times_finished_this_tick ) ;
222
226
} else {
223
- self . times_finished = 1 ;
227
+ self . times_finished_this_tick = 1 ;
224
228
self . set_elapsed ( self . duration ( ) ) ;
225
229
}
226
230
} else {
227
- self . times_finished = 0 ;
231
+ self . times_finished_this_tick = 0 ;
228
232
}
229
233
230
234
self
@@ -305,7 +309,7 @@ impl Timer {
305
309
pub fn reset ( & mut self ) {
306
310
self . stopwatch . reset ( ) ;
307
311
self . finished = false ;
308
- self . times_finished = 0 ;
312
+ self . times_finished_this_tick = 0 ;
309
313
}
310
314
311
315
/// Returns the percentage of the timer elapsed time (goes from 0.0 to 1.0).
@@ -350,15 +354,15 @@ impl Timer {
350
354
/// use std::time::Duration;
351
355
/// let mut timer = Timer::from_seconds(1.0, true);
352
356
/// timer.tick(Duration::from_secs_f32(6.0));
353
- /// assert_eq!(timer.times_finished (), 6);
357
+ /// assert_eq!(timer.times_finished_this_tick (), 6);
354
358
/// timer.tick(Duration::from_secs_f32(2.0));
355
- /// assert_eq!(timer.times_finished (), 2);
359
+ /// assert_eq!(timer.times_finished_this_tick (), 2);
356
360
/// timer.tick(Duration::from_secs_f32(0.5));
357
- /// assert_eq!(timer.times_finished (), 0);
361
+ /// assert_eq!(timer.times_finished_this_tick (), 0);
358
362
/// ```
359
363
#[ inline]
360
- pub fn times_finished ( & self ) -> u32 {
361
- self . times_finished
364
+ pub fn times_finished_this_tick ( & self ) -> u32 {
365
+ self . times_finished_this_tick
362
366
}
363
367
}
364
368
@@ -376,7 +380,7 @@ mod tests {
376
380
assert_eq ! ( t. duration( ) , Duration :: from_secs_f32( 10.0 ) ) ;
377
381
assert ! ( !t. finished( ) ) ;
378
382
assert ! ( !t. just_finished( ) ) ;
379
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
383
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
380
384
assert ! ( !t. repeating( ) ) ;
381
385
assert_eq ! ( t. percent( ) , 0.025 ) ;
382
386
assert_eq ! ( t. percent_left( ) , 0.975 ) ;
@@ -387,7 +391,7 @@ mod tests {
387
391
assert_eq ! ( t. duration( ) , Duration :: from_secs_f32( 10.0 ) ) ;
388
392
assert ! ( !t. finished( ) ) ;
389
393
assert ! ( !t. just_finished( ) ) ;
390
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
394
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
391
395
assert ! ( !t. repeating( ) ) ;
392
396
assert_eq ! ( t. percent( ) , 0.025 ) ;
393
397
assert_eq ! ( t. percent_left( ) , 0.975 ) ;
@@ -397,15 +401,15 @@ mod tests {
397
401
assert_eq ! ( t. elapsed_secs( ) , 10.0 ) ;
398
402
assert ! ( t. finished( ) ) ;
399
403
assert ! ( t. just_finished( ) ) ;
400
- assert_eq ! ( t. times_finished ( ) , 1 ) ;
404
+ assert_eq ! ( t. times_finished_this_tick ( ) , 1 ) ;
401
405
assert_eq ! ( t. percent( ) , 1.0 ) ;
402
406
assert_eq ! ( t. percent_left( ) , 0.0 ) ;
403
407
// Continuing to tick when finished should only change just_finished
404
408
t. tick ( Duration :: from_secs_f32 ( 1.0 ) ) ;
405
409
assert_eq ! ( t. elapsed_secs( ) , 10.0 ) ;
406
410
assert ! ( t. finished( ) ) ;
407
411
assert ! ( !t. just_finished( ) ) ;
408
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
412
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
409
413
assert_eq ! ( t. percent( ) , 1.0 ) ;
410
414
assert_eq ! ( t. percent_left( ) , 0.0 ) ;
411
415
}
@@ -419,7 +423,7 @@ mod tests {
419
423
assert_eq ! ( t. duration( ) , Duration :: from_secs_f32( 2.0 ) ) ;
420
424
assert ! ( !t. finished( ) ) ;
421
425
assert ! ( !t. just_finished( ) ) ;
422
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
426
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
423
427
assert ! ( t. repeating( ) ) ;
424
428
assert_eq ! ( t. percent( ) , 0.375 ) ;
425
429
assert_eq ! ( t. percent_left( ) , 0.625 ) ;
@@ -428,58 +432,86 @@ mod tests {
428
432
assert_eq ! ( t. elapsed_secs( ) , 0.25 ) ;
429
433
assert ! ( t. finished( ) ) ;
430
434
assert ! ( t. just_finished( ) ) ;
431
- assert_eq ! ( t. times_finished ( ) , 1 ) ;
435
+ assert_eq ! ( t. times_finished_this_tick ( ) , 1 ) ;
432
436
assert_eq ! ( t. percent( ) , 0.125 ) ;
433
437
assert_eq ! ( t. percent_left( ) , 0.875 ) ;
434
438
// Continuing to tick should turn off both finished & just_finished for repeating timers
435
439
t. tick ( Duration :: from_secs_f32 ( 1.0 ) ) ;
436
440
assert_eq ! ( t. elapsed_secs( ) , 1.25 ) ;
437
441
assert ! ( !t. finished( ) ) ;
438
442
assert ! ( !t. just_finished( ) ) ;
439
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
443
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
440
444
assert_eq ! ( t. percent( ) , 0.625 ) ;
441
445
assert_eq ! ( t. percent_left( ) , 0.375 ) ;
442
446
}
443
447
444
448
#[ test]
445
449
fn times_finished_repeating ( ) {
446
450
let mut t = Timer :: from_seconds ( 1.0 , true ) ;
447
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
451
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
448
452
t. tick ( Duration :: from_secs_f32 ( 3.5 ) ) ;
449
- assert_eq ! ( t. times_finished ( ) , 3 ) ;
453
+ assert_eq ! ( t. times_finished_this_tick ( ) , 3 ) ;
450
454
assert_eq ! ( t. elapsed_secs( ) , 0.5 ) ;
451
455
assert ! ( t. finished( ) ) ;
452
456
assert ! ( t. just_finished( ) ) ;
453
457
t. tick ( Duration :: from_secs_f32 ( 0.2 ) ) ;
454
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
458
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
455
459
}
456
460
457
461
#[ test]
458
- fn times_finished ( ) {
462
+ fn times_finished_this_tick ( ) {
459
463
let mut t = Timer :: from_seconds ( 1.0 , false ) ;
460
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
464
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
461
465
t. tick ( Duration :: from_secs_f32 ( 1.5 ) ) ;
462
- assert_eq ! ( t. times_finished ( ) , 1 ) ;
466
+ assert_eq ! ( t. times_finished_this_tick ( ) , 1 ) ;
463
467
t. tick ( Duration :: from_secs_f32 ( 0.5 ) ) ;
464
- assert_eq ! ( t. times_finished ( ) , 0 ) ;
468
+ assert_eq ! ( t. times_finished_this_tick ( ) , 0 ) ;
465
469
}
466
470
467
471
#[ test]
468
- fn times_finished_precise ( ) {
472
+ fn times_finished_this_tick_precise ( ) {
469
473
let mut t = Timer :: from_seconds ( 0.01 , true ) ;
470
474
let duration = Duration :: from_secs_f64 ( 0.333 ) ;
471
475
472
476
// total duration: 0.333 => 33 times finished
473
477
t. tick ( duration) ;
474
- assert_eq ! ( t. times_finished ( ) , 33 ) ;
478
+ assert_eq ! ( t. times_finished_this_tick ( ) , 33 ) ;
475
479
// total duration: 0.666 => 33 times finished
476
480
t. tick ( duration) ;
477
- assert_eq ! ( t. times_finished ( ) , 33 ) ;
481
+ assert_eq ! ( t. times_finished_this_tick ( ) , 33 ) ;
478
482
// total duration: 0.999 => 33 times finished
479
483
t. tick ( duration) ;
480
- assert_eq ! ( t. times_finished ( ) , 33 ) ;
484
+ assert_eq ! ( t. times_finished_this_tick ( ) , 33 ) ;
481
485
// total duration: 1.332 => 34 times finished
482
486
t. tick ( duration) ;
483
- assert_eq ! ( t. times_finished( ) , 34 ) ;
487
+ assert_eq ! ( t. times_finished_this_tick( ) , 34 ) ;
488
+ }
489
+
490
+ #[ test]
491
+ fn paused ( ) {
492
+ let mut t = Timer :: from_seconds ( 10.0 , false ) ;
493
+
494
+ t. tick ( Duration :: from_secs_f32 ( 10.0 ) ) ;
495
+ assert ! ( t. just_finished( ) ) ;
496
+ assert ! ( t. finished( ) ) ;
497
+ // A paused timer should change just_finished to false after a tick
498
+ t. pause ( ) ;
499
+ t. tick ( Duration :: from_secs_f32 ( 5.0 ) ) ;
500
+ assert ! ( !t. just_finished( ) ) ;
501
+ assert ! ( t. finished( ) ) ;
502
+ }
503
+
504
+ #[ test]
505
+ fn paused_repeating ( ) {
506
+ let mut t = Timer :: from_seconds ( 10.0 , true ) ;
507
+
508
+ t. tick ( Duration :: from_secs_f32 ( 10.0 ) ) ;
509
+ assert ! ( t. just_finished( ) ) ;
510
+ assert ! ( t. finished( ) ) ;
511
+ // A paused repeating timer should change finished and just_finished to false after a tick
512
+ t. pause ( ) ;
513
+ t. tick ( Duration :: from_secs_f32 ( 5.0 ) ) ;
514
+ assert ! ( !t. just_finished( ) ) ;
515
+ assert ! ( !t. finished( ) ) ;
484
516
}
485
517
}
0 commit comments