rustraight 0.5.2

A simple 2D game library for Rust, inspired by DXLib
// time.rs — フレームごとの経過時間(デルタタイム)と起動からの累計時間を管理する。

use std::time::Instant;

struct TimeState {
    start:        Instant, // アプリ起動時刻
    last_update:  Instant, // 直前の tick() 呼び出し時刻
    delta_time:   f32,     // 直前フレームからの経過秒数
    elapsed_secs: f64,     // 起動からの累計秒数
}

impl TimeState {
    fn new() -> Self {
        let now = Instant::now();
        Self {
            start:        now,
            last_update:  now,
            delta_time:   0.0,
            elapsed_secs: 0.0,
        }
    }

    fn tick(&mut self) {
        let now = Instant::now();
        self.delta_time   = now.duration_since(self.last_update).as_secs_f32();
        self.elapsed_secs = now.duration_since(self.start).as_secs_f64();
        self.last_update  = now;
    }
}

thread_local! {
    static TIME: std::cell::RefCell<TimeState> = std::cell::RefCell::new(TimeState::new());
}

/// 毎フレーム呼び出し、デルタタイム・累計時間を更新する(`advance_frame` から呼ばれる)。
pub(crate) fn tick_time() {
    TIME.with(|t| t.borrow_mut().tick());
}

/// 直前フレームからの経過秒数を取得する。
pub fn delta_time() -> f32 {
    TIME.with(|t| t.borrow().delta_time)
}

/// アプリ起動からの累計経過秒数を取得する。
pub fn elapsed_time() -> f64 {
    TIME.with(|t| t.borrow().elapsed_secs)
}