2005-07-18
Chararina 開発サンプルの "タイヤネコ"では、毎分 0秒に "分"のカウンタを進めています。 毎分 0秒のトリガは MinDrive アクションによって行われ、UpdateMin() 関数で処理されます。 プロパティ TIME_WorkTime に保存されている時刻を取り出し、1加算し、再度 TIME_WorkTime に保存します。
つまり、"分" の数を数えているわけです。
これが Chararinaキャラクタの時間認識になります。
Main.aya
// 時間イベント駆動系(毎分0秒の時に呼ばれる) // 但しなにかしらの処理を実行中の場合はこの処理は呼ばれない action MinDrive@( Second() == 0 ) { UpdateMin(); // 最後にチェックした時間を記録しておく PutProperty( "TIME_LastMinChecked", itoa( Time() ) ); } // 毎分0秒の処理を行う void UpdateMin() { DM( 5, "UpdateMin" ); // ** その他の処理 ** // 稼働時間の加算処理 int worktime = atoi( GetProperty( "TIME_WorkTime" ) ) + 1; PutProperty( "TIME_WorkTime", itoa( worktime ) ); … 以下略… }
この TIME_WorkTime を使って、終了時にメッセージを表示するわけです。
動くかどうか分かりませんが、だいたいこんな具合でしょう。
Greeting.aya
// 終了時あいさつ(主にMain.ayaのShutDownアクションから呼ばれる) void Greeting_ShutDown() { // 稼動時間を取得(分) int worktime = atoi( GetProperty("TIME_WorkTime") ); // フキダシをクリア Talk( "\e" ); // 稼動時間に応じて台詞を変える if( worktime < 60 ){ // 稼働開始から1時間未満の時は不満をたれる Talk( "え、もう終わっちゃうの?\w" ); } if( worktime >= 60 * 3 ){ // 稼動開始から3時間以上たっている場合のみ表示する { string sMessage = ""; int iHour; int iMin; iHour = worktime / 60; iMin = worktime % 60; sMessage = itoa( iHour ) + "時間"; if( 0 < iMin ) { sMessage = sMessage + itoa( iMin ) + "分"; } Talk( sMessage + "も頑張ったね。\w" ); } } // 稼働時間に関係ない共通台詞(ランダムに分岐) int rnd = Random( 2 ); if( rnd == 0 ){ Talk( "お疲れさまでした。" ); } else { Talk( "それじゃ、またね。" ); } // 終了時間を記録 PutProperty( "TIME_Last_ShutDown", itoa( Time() ) ); }
稼働時間が短いと、文句を言う輩もいます。 この例だと、worktime < 60、つまり 60分未満だと文句をタレます。 例えば PC の時計を 1時間進めても、「毎分 0秒」を 60回通過しているわけではないので、やっぱり文句を言われます。 別に無視してりゃいいんですが、仕組みが分かっているのに対策が取れないと言うのは気分が悪いものです。
要するに、最速で毎分 0秒を作り出せれば、時間を掛けずに恨み言を言われないようにできます。 そこで、こんなツールを作ってみました。 Chararina用加速試験ツールですね。 機能はとてもシンプル。
毎分 0秒を過ぎると、システム時計を 59秒まで進めます。
または、0秒を過ぎると 9秒まで進め、さらに 10秒を過ぎると 59秒まで進めます。
システム時刻を変化させますので、色々と支障が出る可能性があります。 また、TimeAccel 自身の原因により、何か問題が起こる可能性もあります。 お定まりですが、完全に自己責任で使用してください。 何人も一切の保証や補償は行いません。
TimeAccel.lzh (9,323 Byte)
TimeAccel.exe を適当なフォルダに置いて、好きな方法で起動してください。
Exitボタンか、タイトルバー右端の×を押下すると終了します。
このプログラムは Microsoft VisualBasic 6.0 (SP6) で作られているため、実行するには runtime が必要です。 Windows2000 や WindowsXP では最初から runtime が入っていますが、そうでない場合は VB6 用の runtime を入手してインストールする必要があります。 また、VB6JP.DLL が無いと日本語が文字化けします。 こちらは Windows2000 や WindowsXP でも別途インストールする必要があります。
いろんな所で配布されています。 例えば Vector のソフトライブラリから入手すればよいでしょう。
現在のシステム時計の日時を表示します。
加速中は、どんどん進みます。
たぶん実際はこの位の時刻だろう。
と言う日時を表示します。
加速開始日時から、秒の数を足して求めた値です。
操作のタイミングによって数秒の誤差は出ます。
システムの負荷状況によっては、秒を数え損ねて時計が遅れるかも知れません。
それ以前に、そもそも 1000ms 単位で処理しているので、1回の操作で1秒未満の誤差が蓄積していくのは宿命です。
テキストボックスに指定した時間だけ、システム時計を過去に戻します。 基準になるのは "システム:"欄に表示している日時です。 例えばテキストボックスに "12" が入っているとき、時計を 12時間過去に戻します。
加速処理(毎分 0秒を過ぎるとシステム時計を 59秒に進める処理)を実行します。 時刻を見ているプログラムは毎分1回、59→0秒の遷移を拾えるでしょう。
"10秒"チェックボックスをチェックすると、加速処理で 9→10 秒の遷移でも加速処理を行ないません。 時刻を見ているプログラムは毎分2回、59→0秒と 9→10秒の遷移を拾えるでしょう。
加速中に >ボタンを押下すると、加速処理を停止します。
"たぶん:"欄に表示している日時にシステム時計を合わせます。
加速を停止してから、本来の時刻にシステム時計を戻すのが目的ですが、誤差が大きいのであまり信用できません。
NTPサーバに接続して時刻合わせを行なうソフトウェアを使うのが、簡単・確実でしょう。
ウィンドウの位置,|<<の指定値,"10秒"チェックの状態を TimeAccel.ini に保存して終了します。 保存場所は TimeAccel.exe が置かれているフォルダです。 タイトルバー右端の ×ボタンで終了する時には、iniファイルは作成しません。 なお、レジストリは使いません。
ウインドウを最小化すると、タスクバーには加速状態と "たぶん:"欄の時刻を表示します。
「>」 … 待機状態です。加速していません。
「>>」… 加速中です。