忍者ブログ

slack diary

鉄道模型シミュレーター(VRM)を紹介するホームページ「CaldiaのVRM Room」の更新情報と、Caldia本人の日常ぐだぐだ日記。

スクリプトって結局どこが難しいのか。

久しぶりにVRMの話。
スクリプトに関する話。
ここでは「見える動き」に関して書いてみる。
見える動きと言うのは車両制御や信号、踏み切り、ポイントなどのこと、逆に見えない動きと言うのは主に変数制御などの事を指す。

さて。
見える動きにスクリプトを使用する場合、それらに使われるコマンドは主に4種類に分けられると思う。
まずコマンドを実行するためのスイッチとなる入力系「~のとき」(When)。
次にそれらをどのように実行するかを問う条件式。
実行する対象「~を」(Who)。
そして実際に動きを実行する出力系「~する」(What)。
以上である。
これらのコマンドをよく理解していれば、ある程度何でもかんでも出来るようになるんじゃないかと思った次第。
もう少し詳しく書いてみる。

まず入力系。
これはどのタイミングでイベントを実行させるかを決めるものだが、ぶっちゃけて言うとVRMには時間で決める「タイマー」か編成が特定の場所を通る「センサー」かユーザーがスイッチを押す「キー」の3種類しかない。
具体的には
・ビュワーを起動してから何秒後(何秒毎)かに~が起きる。
・センサーに触れたとき~が起きる。
・キーを押したとき~が起きる。
のどれかでしかイベントが実行されず、一見複雑な成立条件のイベントでもこれら3つの複合でしかない。
(厳密にはcallなどもあるが、元をたどれば複合系であり、条件式が難しいだけ。後述する)
ついでに言うとイベントの実行基準はタイマーが一番厳格であり、キーが一番自由だと思う。
例を挙げると「センサーに触れてから何秒後に~が起きる」や「キーが押された状態でセンサーに触れると~が起きる」は比較的イベントを作りやすいが、「何秒後に列車がセンサーに触れると~が起きる」や「何秒後にキーを押すと~が起きる」などはイベントとして作りにくいし、ユーザーも扱いにくい(気がする:あくまで主観)。

次に対象。
これも思いのほか少なく、VRMのオブジェクトとして成りうるのは、レイアウト自体か編成か車両か信号か踏切か転車台かポイントかセンサーか音源かカメラぐらいしかない。
一つの出力に複数の対象がぶらさがってもよく、「キーを押したとき編成が減速し、車両の明かりがつき、信号が赤に変わり、踏切が鳴り止み、ポイントが変わり転車台が意味も無く回りだし、構内にアナウンスが流れる」
といった処理も可能である。

それと対を成すようにあるのが出力。
基本的に対象と出力は一対一の関係になる。
同じ入力のタイミングで同じオブジェクトに対して違う動作を入力することは無意味だということは分かるはず。
そして、出力形式も「ON/OFF」「走る/停止」「直進/曲折」などのスイッチ動作がほとんどである。
(ちなみに車両は複数の出力形式があるが対象を踏まえる上で「A編成のB両目の車内ライト」や「C編成の速度」などを対象として考えるとわかりやすいだろう)

こうしてみるとスクリプトで何かをしたいとき「~のとき~を~する」というふうに考えれば、スクリプト自体は案外簡単に見える。
しかし、実際玄人ユーザーが自身のブログなどで書かれているスクリプトを見たところでさっぱり分からない初心者ユーザーもいるはず。
なんで、分からないのかといえば、またスクリプトを難しくしている要因が、今しがた説明を飛ばした「条件式」であり、変数や条件分岐を操作する「見えない処理」があるのである。

・・・とまあ、ここまで書きながらその条件式をレクチャーする気も暇も無く、更にはオブジェクト指向のことも説明省いてるし、と今更気が付いた。
でも、初心者ユーザーたちはおそらく「~のとき~を~する」の処理さえ出来ればある程度満足してVRMを扱ってくれるんじゃないかな、と思った次第。
うん、それならレクチャーできるかもしれないなぁ、と思いこの記事を書いた。
ただ本当に出来るかどうかは気分次第なので誰も期待せぬように。
でわでわ。
PR

コメント

1. 無題

ご無沙汰です。
まさしくWhen Who What ですよね。
極論すればINがあってOUTがあるって所でしょうか。
基本的にはSetEvent~系をINとすれば大して数は無いですからね。
実は一番難しいのはビュワーちゃんが何を何処まで無視して動いてるの・・・だったりして。

2. 無題

どもです。
スクリプトの難しいことの要因は他にもさまざまあるでしょうね。
イベントがあっちこっち行ったり、並列処理していて一般的な考えが通じない等々。
もっともオブジェクト指向プログラム自体人それぞれの解釈の仕方があり、みんながみんな「スクリプトとはこうである!」と言っている事が違っていて、それを見ている初心者ユーザーが更に混乱しているのだとも思います。
版元がもっとサンプルコードなりガイドラインなり出してくれればもうちょっとマシだったんじゃないかな~とも思いますけど。

最新コメント

[05/30 Caldia]
[05/19 C-PON]
[10/03 vrmkyobuilding]
[05/10 Caldia]
[05/04 USO800鉄道]