System4.0で高機能タイマー
普通、System4.0で時間を測定するときは、system.GetTime() を用いて、差を取ったりします。
ちゃんとしたタイマーを使いたいときは、sact_timer_t を使うと幸せになれます。
sact_timer_t の使い方
sact_timer_t timer; A; int nClickWaitTime=timer.Get(); timer.Set(); |
みたいな。
ですが、このタイマはシステムと密接に関係しているので、使いづらいという事態が発生しかねません。
つまり、れつとれみたいなのです。あれの一部モードでは、背景は動いて、バーは動かず、AIは停止みたいな事をしています。
個別にいろいろと実装するのはものすごく大変でした。
なので、今度からはそれを楽ちんにするための、クラスを作ろうと考えたのがきっかけです。
そんなわけで、作ってみたのが、StartStop Timerってものです。
ちょっと高性能なタイマーです。
特徴としては、
・sact_timer_t の発展系。基本は同じ命令で。
・複数の時間軸を定義できる。
・ある時間軸は個別に、一時停止、レジューム、時間経過倍率設定 ができる。
・時間軸は、ミリ秒とカウンタ(FPSと一緒に使うと良い)の二種類が選べる。
・タイミングクラスと一緒に使うと、さらに楽ちん。
※ 必要十分なテストを行っていません。問題があったら連絡下さい。
StartStop Timerの使い方
基本的に、sact_timer_t と同じです。
ss_timer_t timer; A; int nClickWaitTime=timer.Get(); timer.Set();
|
複数使えますし、停止も出来ます。
ss_timer_t timer1; ss_timer_t timer2; timer2.Stop(); A; timer2.Resume(); A; int nAllTime=timer1.Get(); int nOneTime=timer2.Get(); |
時間の流れを変えることも出来ます。
ss_timer_t timer1; ss_timer_t timer2; timer2.SetRate(0.5); A; int nAllTime=timer1.Get(); int nHalfTime=timer2.Get(); |
FPSに依存させることも出来ます。
ss_timer_t timer1; timer1.SetCountTick(true); while(true){ //....なんらかの処理 SACT_UPDATE(); timer1.AddTick(); int nFrames=timer1.Get(); } |
で、タイミングとの連携はこのようにやります。
例えば、1秒ごとに何かの処理を行いたい場合は、このようにします。
ss_timer_t timer; ss_timming timm; timm.InitTimming(timer); timm.StartInterval(1000); while(true){ //..何らかの処理 SACT_UPDATE(); if(timm.Check()){ system.Output("1000ミリ秒経ちました。\n"); m_timming.Start(); } } |
おー、非常にスバラシイですねー。
もちろん、タイマがFPS依存であれば、StartIntervalを60にすれば、60フレームごとに処理が行えます。
ちょっと一時停止したいときには、タイマを一時停止すればよいのです。おお、なんと簡単な!。
感想
時間と密接に動作が関係するゲームであれば、非常に便利なクラスになっていると思います。
今後いくつかのtipsはこの機能に強く依存していく可能性が高いです。だって、便利なんで。