//StartStop Timer構造体 // 複数の時間軸を定義できます。 // ある時間軸は停止させるが、もう片方は停止させない。や、 // ある時間軸は通常速度、ある時間軸は2倍速。というのができます。 // SACTのタイマの改造です。 //FPSカウンタ替わりとしても利用できます。なんでもありっすね^^ //普通に使うとき(経過秒数) // Start() -> Get() で秒数 //FPSで使うとき(経過FPS数) // SetCountTickでtrueをセット // Start()  AddTickをループ中で呼ぶ  Get() でFPS数 //ss_timmingを使えば、 //指定秒経ったとき、あるいは指定FPS数経ったとき //で使える。 //タイマー構造体 struct ss_timer_t { void Start(); int Get(); void Set(int nTime); void Stop(); void Resume(); ss_timer_t(); void SetRate(float r){m_fRate=r;} float GetRate(){return m_fRate;} //FPS固定のため void SetCountTick(bool tc){m_bCountTick=tc;} bool GetCountTick(){return m_bCountTick;} void AddTick(){m_nNowTick++;} private: int m_nStopStack; int m_nStartTime; int m_nStopTime; float m_fRate; int m_nNowTick; bool m_bCountTick; }; //StartStopTimer Timming構造体 // StartStopTimerにおいて、 // あらかじめ指定した時間が経過すると発火します。 //タイマ依存、タイミング struct ss_timming { void InitTimming(ref ss_timer_t tim); void StartInterval(int msec); void Start(); bool Check(); void Stop(); int GetTime(); float GetPercent(); bool IsRunning(){return !Stopper;} private: ref ss_timer_t timer; int Interval; int StartSec; bool Stopper; }; //##メソッド void ss_timer_t::Stop(){ if(m_nStopTime==-1){ if(m_bCountTick){ m_nStopTime=m_nNowTick; }else{ m_nStopTime=SACT.Timer_Get(); } } m_nStopStack++; } void ss_timer_t::Resume(){ m_nStopStack--; if(m_nStopStack<0) m_nStopStack=0; if(m_nStopStack==0){ int stoptime; if(m_bCountTick){ stoptime=m_nNowTick - m_nStopTime; }else{ stoptime=SACT.Timer_Get() - m_nStopTime; } m_nStartTime+=stoptime; m_nStopTime=-1; } } int ss_timer_t::Get() { int nCurrentTime; if(m_bCountTick){ nCurrentTime = m_nNowTick; }else{ nCurrentTime = SACT.Timer_Get(); } if(nCurrentTime < m_nStartTime) { SACT_SYSTEM_LOG_OUTPUT("*WARNING* sact_timer_t::Get() nCurrentTime < m_nStartTime\n"); m_nStartTime = nCurrentTime; } return (nCurrentTime - m_nStartTime) * m_fRate; } void ss_timer_t::Set(int nTime) { if(m_bCountTick){ m_nStartTime = m_nNowTick - nTime; }else{ m_nStartTime = SACT.Timer_Get() - nTime; } } ss_timer_t::ss_timer_t() { m_bCountTick=false; m_nNowTick=0; m_fRate=1.0; Start(); } void ss_timer_t::Start(){ if(m_bCountTick){ m_nStartTime = m_nNowTick; }else{ m_nStartTime = SACT.Timer_Get(); } m_nStopStack=0; m_nStopTime=-1; } void ss_timming::InitTimming(ref ss_timer_t tim){ timer <- tim; Stopper=true; } void ss_timming::StartInterval(int msec){ Interval=msec; StartSec=timer.Get(); Stopper=false; } void ss_timming::Start(){ StartSec=timer.Get(); Stopper=false; } bool ss_timming::Check(){ if(Stopper) return false; return (timer.Get() >= StartSec+Interval); } void ss_timming::Stop(){ Stopper=true; } int ss_timming::GetTime(){ return timer.Get()-StartSec; } float ss_timming::GetPercent(){ float rate=float(timer.Get()-StartSec) / float(Interval); if(rate>1) rate=1.0f; if(rate<0) rate=0.0f; return rate; }