pub struct Timer { /* private fields */ }Expand description
灵活的计时器工具
Timer 提供了丰富的计时功能,支持一次性和重复计时、暂停恢复等操作。
它是实现时间相关游戏逻辑的核心工具。
§设计特点
- 零分配: 所有操作都不涉及内存分配
- 高精度: 使用
Duration提供微秒级精度 - 状态管理: 清晰的状态转换和查询接口
- 灵活配置: 支持多种创建和配置方式
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
// 创建 3 秒一次性计时器
let mut timer = Timer::from_seconds(3.0);
// 创建 1 秒重复计时器
let mut repeat_timer = Timer::repeating_from_seconds(1.0);
// 在游戏循环中更新
let delta = Duration::from_millis(16); // ~60 FPS
timer.tick(delta);
repeat_timer.tick(delta);
if timer.just_finished() {
println!("Timer finished!");
}
if repeat_timer.just_finished() {
println!("Repeat timer triggered!");
}Implementations§
Source§impl Timer
impl Timer
Sourcepub fn from_seconds(seconds: f32) -> Timer
pub fn from_seconds(seconds: f32) -> Timer
从秒数创建一次性计时器
§示例
use anvilkit_core::time::Timer;
let timer = Timer::from_seconds(3.5);
assert_eq!(timer.duration_seconds(), 3.5);Sourcepub fn repeating_from_seconds(seconds: f32) -> Timer
pub fn repeating_from_seconds(seconds: f32) -> Timer
从秒数创建重复计时器
§示例
use anvilkit_core::time::Timer;
let timer = Timer::repeating_from_seconds(1.0);
assert!(timer.is_repeating());
assert_eq!(timer.duration_seconds(), 1.0);Sourcepub fn from_millis(millis: u64) -> Timer
pub fn from_millis(millis: u64) -> Timer
从毫秒数创建一次性计时器
Sourcepub fn repeating_from_millis(millis: u64) -> Timer
pub fn repeating_from_millis(millis: u64) -> Timer
从毫秒数创建重复计时器
Sourcepub fn tick(&mut self, delta: Duration)
pub fn tick(&mut self, delta: Duration)
更新计时器
应该在每帧调用此方法来推进计时器。
§参数
delta: 自上次更新以来的时间间隔
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0);
// 模拟 0.5 秒
timer.tick(Duration::from_millis(500));
assert_eq!(timer.percent(), 0.5);
assert!(!timer.finished());
// 再模拟 0.5 秒
timer.tick(Duration::from_millis(500));
assert!(timer.finished());
assert!(timer.just_finished());Sourcepub fn finished(&self) -> bool
pub fn finished(&self) -> bool
检查计时器是否已完成
对于一次性计时器,完成后会一直返回 true。
对于重复计时器,只有在刚完成的那一帧返回 true。
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0);
assert!(!timer.finished());
timer.tick(Duration::from_secs(1));
assert!(timer.finished());Sourcepub fn just_finished(&self) -> bool
pub fn just_finished(&self) -> bool
检查计时器是否在本帧刚完成
这对于触发一次性事件非常有用,避免重复触发。
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0);
timer.tick(Duration::from_millis(999));
assert!(!timer.just_finished());
timer.tick(Duration::from_millis(1));
assert!(timer.just_finished());
timer.tick(Duration::from_millis(1));
assert!(!timer.just_finished()); // 下一帧不再是 "刚完成"Sourcepub fn elapsed_seconds(&self) -> f32
pub fn elapsed_seconds(&self) -> f32
获取已经过的时间(秒)
Sourcepub fn duration_seconds(&self) -> f32
pub fn duration_seconds(&self) -> f32
获取计时器总时长(秒)
Sourcepub fn percent(&self) -> f32
pub fn percent(&self) -> f32
获取完成百分比 (0.0 到 1.0)
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
let mut timer = Timer::from_seconds(2.0);
timer.tick(Duration::from_secs(1));
assert_eq!(timer.percent(), 0.5);Sourcepub fn remaining(&self) -> Duration
pub fn remaining(&self) -> Duration
获取剩余时间
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
let mut timer = Timer::from_seconds(3.0);
timer.tick(Duration::from_secs(1));
assert_eq!(timer.remaining(), Duration::from_secs(2));Sourcepub fn remaining_seconds(&self) -> f32
pub fn remaining_seconds(&self) -> f32
获取剩余时间(秒)
Sourcepub fn reset(&mut self)
pub fn reset(&mut self)
重置计时器到初始状态
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0);
timer.tick(Duration::from_millis(500));
assert_eq!(timer.percent(), 0.5);
timer.reset();
assert_eq!(timer.percent(), 0.0);
assert!(!timer.finished());Sourcepub fn pause(&mut self)
pub fn pause(&mut self)
暂停计时器
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0);
timer.pause();
assert!(timer.is_paused());
// 暂停状态下 tick 不会推进时间
timer.tick(Duration::from_secs(1));
assert_eq!(timer.elapsed_seconds(), 0.0);Sourcepub fn resume(&mut self)
pub fn resume(&mut self)
恢复计时器
§示例
use anvilkit_core::time::Timer;
use std::time::Duration;
let mut timer = Timer::from_seconds(1.0);
timer.pause();
timer.resume();
assert!(timer.is_running());Sourcepub fn set_duration(&mut self, duration: Duration)
pub fn set_duration(&mut self, duration: Duration)
Sourcepub fn set_repeating(&mut self, repeating: bool)
pub fn set_repeating(&mut self, repeating: bool)
设置是否为重复计时器
§示例
use anvilkit_core::time::Timer;
let mut timer = Timer::from_seconds(1.0);
assert!(!timer.is_repeating());
timer.set_repeating(true);
assert!(timer.is_repeating());Sourcepub fn is_repeating(&self) -> bool
pub fn is_repeating(&self) -> bool
检查是否为重复计时器
Sourcepub fn is_running(&self) -> bool
pub fn is_running(&self) -> bool
检查计时器是否正在运行
Sourcepub fn state(&self) -> TimerState
pub fn state(&self) -> TimerState
获取计时器状态
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Timer
impl RefUnwindSafe for Timer
impl Send for Timer
impl Sync for Timer
impl Unpin for Timer
impl UnsafeUnpin for Timer
impl UnwindSafe for Timer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Convert
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Convert
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
Convert
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Convert
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.