2005/11/23

デジタル時計を表示する  VRMスクリプト禅問答
【怎麼生】
VRMで「電○でGo」みたいなのを作りたいのですが、どうすればいいですか。

【説破】 4.0.2.4
悪いことは言わないので、とっとと「○車でGo」を買いなさい。

まぁ、そういうボケはさておき。
このシリーズで書いてきたように、自律的な自動運転すら可能であることは立証済みですから、根気さえあればそのようなモノを作るのは不可能ではありません、その価値があるか否かは別にして。
仮にそれに挑戦しようという強者がおられるとして、今回はおそらく最初に問題となるであろう「時計」を作る方法でも紹介しておきましょう。


では、いきなりサンプルコードから。
[レイアウトスクリプト]
Var ClockID
Var VarClock
set VarClock 100000 // 10:00:00から開始
//イベント定義
SetEventTimer this MtdClock ClockID 1000 //(1)
//
//デジタル時計メソッド
//
BeginFunc MtdClock
Var Tmp
add VarClock 1 //(2)
mov Tmp VarClock
mod Tmp 100 //(3)
ifeq Tmp 60
add VarClock 40
mov Tmp VarClock
mod Tmp 10000 //(4)
ifeq Tmp 6000
add VarClock 4000
endif
endif
DrawMessage "現在時刻" //(5)
DrawVar VarClock
DrawMessage ""
DrawMessage ""
EndFunc
何が起こるか、については、実際にレイアウトに組み込んでみてもらった方が早いと思います。これをレイアウトスクリプトとしてコピー&ペーストするだけですから簡単でしょう。
スクリプト内で何をやっているのか、コード中にふった番号に沿って簡単に説明しておくことにします。

(1) SetEventTimerで1,000ミリ秒毎にメソッドMtdClockを実行するイベントを定義する。つまり、MtdClockは1秒毎に実行される。
(2) グローバル変数VarClockに1を加算する。つまり、VarClockは1秒毎に1ずつ増える。これだけでは時計にならない。
(3) そこでVarClockを100で割った余りを取る(mod命令)。この結果が60であった場合(ifeq命令)、VarClockに40を加算する。つまり、59の次は60ではなく100になり、秒から分への繰り上げがおこなわれたことになる。
(4) 同様に、VarClockを10,000で割った余りが6,000の場合、4,000を加算する。つまり、5,959の次は10,000になり、分から時への繰り上げがおこなわれたことになる。
(5) これをログウィンドウに表示する。1回の表示毎に4行を使えば(末尾のDrawMessage ""が調整用のそれ)常に同じ高さにVarClockの値=デジタル時計が表示され続ける。

あくまでもサンプルなので、現時点ではいろいろ問題があります。現時点のVRMスクリプトには文字列操作系の命令が未実装なので、時分秒を区切る「:」を加えることはまだ出来ませんし、「100000」=「10:00:00」の1秒前は「095959」ではなく「95959」になってしまいます。「235959」の1秒後を0リセットする処理を加えるのは簡単ですが、表示はいきなり「0」になってしまいます。
この他、冒頭でネタにしたように本気で「電車でGo」風の実装をしようと思えば、駅到着予定時刻と現在時刻の差を求めるメソッドも必要(単に引き算をすると嘘っぱちな値になる)ですし、もちろんそれ以外にもなんやかやと課題はたくさんありますが、これも冒頭に書いたように決して不可能ではありません。

本気で「オレはやるぞ!!」とおっしゃる方がおられれば、コメント欄にでも一言書いていってください。応援はします。応援だけですが。
0

コメントを書く

この記事にはコメントを投稿できません




teacup.ブログ “AutoPage”
AutoPage最新お知らせ