2006/7/28

自動踏切Ver1.1βの課題  VRMスクリプト禅問答
晒してみたものの、同じエントリに書いた「電波」に衆目が集まってしまい、最早忘れ去られた感のある「gws1.0/自動踏切Ver1.1β」について続報。

とりあえず、TOMIX踏切や警報機DにSetCrossingSignを設定して警報機を作動させるとビュワーが落ちる、という問題が、アップデータ4.0.4.3で修正されていることを確認しました。安心。ちなみに、373系のエラーも直ってましたね。
と言うワケで、可用性の観点からの不安は払拭されたんですが、厄介な問題を忘れていたことに気づきました。気づかせてくれたのは(ご本人にそんな気はまったくないと思いますが・笑)こちらの新電氏の手になる踏切デモ動画。とりあえず、見てください。

ハイ、もう説明は不要ですね?
1.1βでは「左右の遮断機が閉じる時間差」を完全に失念していました。以前にこんなことを自分で書いてるのにね(苦笑)。

さて。
これにどう対処したものか、というのが今日のネタなワケです。結論から言うと、対処自体は簡単なのですが、どうにもそれはボクちゃんの美学に反する実装なワケで、ちょっとじっくり考えてから現物化しようかと思っておる次第。


*     *     *

最初に「簡単な解法」の方に触れておきましょう。
1.1βではユーザーがSCRIPTウィザード上で選択すべき踏切部品を3種類に区別しています。つまり「制御の親(センサー組み込み時に参照される踏切)」「親と同じ側」「親の逆側」です。これは、列車方向表示を、線路を跨いで逆転させる必要性から生まれた仕様です。
ここにさらに「親と同じ側の遅れて降りる遮断機」「逆側の遅れて降りる遮断機」を加え、これらについて専用のスクリプト、すなわち、いきなり遮断機を閉じるのではなく、SetEventAfterで遮断機動作の所要時間+α待ってから動作するスクリプトを組み込めばOKです。簡単ですね。

そう、スクロールを作るのは簡単です。
厄介なのは、使い方、つまりこのスクロールのユーザーの手間が増えること(使い方が難しくなる、制約が生じる、の意)です。

これはボクの個人的な美学ですが、なんらかのシステムを他人に提供する人間は、そのシステムの使い方について、使い手(ユーザー)に対して技術的な必然を超えた制約を課すべきではない、と思っています。もう少し噛み砕くとですね、たとえば「常に同時に使うことがわかっているのに、必ずA、B、Cの順番に置かないと動作しない部品」なんてのはナンセンスなワケで、システム提供側は「A、B、Cをどういう順番で置かれても動作する仕組みを提供」すべきだと思うワケですよ。

で。
踏切の例で言うとですね「制御の親」を別途選択するのは、これはもう技術的な必然なんです。厳密に言うと、センサー追加=踏切を通る線路の数の自由度を担保するために必須です。それから、線路を挟んでどちら側の踏切部品か、というのも列車方向表示の観点から「止む無く」必須です。
1.1βは、これも仕方なく「4つ用」「6つ用」「8つ用」に分かれています。これは、はっきり言って我ながらナンセンスです。ただ、現行のSCRIPTウィザードの仕様上、自分以外のオブジェクトのメソッドを実行するオブジェクト(この例ではセンサー)を後から追加するのは比較的自由なんですが、逆の立場、すなわち他のオブジェクトから実行されるメソッドを有するオブジェクト(この例では踏切)を任意に追加するのは事実上不可能なんですね。
で、少しでもユーザーの実装自由度を担保すべく、遮断機と警報機は敢えて区別しない、という設計を採用しています。つまり、制御の親と同じ側か逆側か、さえ正しく使い分ければ、選択される部品は警報機であっても遮断機であっても動作するようにコーディングしました(この過程で例のバグに気づいたワケですが)。
ここで言う「実装自由度」というのは、警報機と遮断機の組み合わせです。現実の踏切の実装は思いのほか多岐にわたります。警報機のみで遮断機がなかったり、警報機1つに対し遮断機が1つだったり2つだったり・・・で、仕様制約で「4つ用」「6つ用」「8つ用」と分けるのは仕方がなかったんですが、それをどう使うか、つまり、たとえば6つを警報機2つと遮断機4つに使うのか、警報機4つと遮断機2つに使うのか・・・は、ユーザーの自由に任せよう、というのが今回のコーディングの基本方針だったワケです。

が、先に述べた「簡単な解法」を採用してしまうと、これが根底から覆ります。「制御の親」「親と同じ側」「親の逆側」「親と同じ側の遅れて降りる遮断機」「逆側の遅れて降りる遮断機」をそれぞれ選択するとなると、これは事実上、踏切部品の組み合わせを規程してしまっています。つまり、このスクロールを使うために決まった部品の使い方が強制されるワケで、これは前述した「システムの使い方について、ユーザーに対して必然を超えた制約を課すべきではない」というボクの美学に反するワケですよ。うーん、悩ましい。

自由度を担保するために、1.1βと同じ仕様のスクロールを2つ組み合わせて使う、というケースも想定してみました。つまり、たとえば警報機4つと遮断機4つの踏切は「部品2つ用(これはVer1.0の直系のバージョンアップになるので未リリースですが)」と「部品6つ用」を組み合わせて使う、とするワケです。これにより駆動するセンサーの系統を分けれるので、遅延して閉じる遮断機が再現可能になります。
が、これにも問題があって、これまた新電氏の動画にそのヒントが含まれています。もう一度動画を見てみてください。実物に合わせるならば同時に上がるべきすべての遮断機が、閉じるとき同様に時間差をもって上がっていますね。
これは、おそらくは氏がこの作例レイアウトを作る際、製品付属か或いは拙作スクロールを使って、センサー配置の異なる2系統の踏切でこの動作を実現したことによります。ご存知の通り、VRM4では1つのレール部品に対してセンサーは1つしか置けないので、同種スクロールからスクリプトを流し込む限り、2系統の踏切制御に遮断機を開く指令は最低でもレール部品1つ分はズレざるを得ません。

あちらを立てればこちらが立たず。
こちらを立てればあちらが立たず。

*     *     *

さて。
今回、このエントリを書いた意図は、この問題に関する諸兄のご意見を伺うため、というよりは、むしろ、ghostはスクロールをこのように考えて書いている、ということを知ってもらいたかったからです。もちろん、自慢ではなくて、後へ続く方の参考にしていただくために、ですが(嘘臭いですか、そうですか)。
とは言え、列車方向表示連動可能な踏切制御手段はそれなりにニーズがあると思うので、どこかで美学とは折り合いをつけて、コイツを仕上げたいと思っているのも事実です。とりあえずは、どういう組み合わせバリエーションが(遮断機、警報機それぞれ4つずつは基本として、その他に)あれば使い勝手が良いか、あたりについてご意見を募集します。

ちなみに、ボクがここで述べた美学にこだわる理由は、VRMユーザーのために!とか、オレってば賢いだろう!、ではなく、単にこういうことにユーザーが悩まざるを得ない状況を生み出してくれている

I.MAGiCの中の人への嫌味

ですので、その点は誤解のないように。
0

コメントを書く

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




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