2006/8/16

自動踏切Ver1.1βの課題の解法がみつかった件  VRMスクリプト禅問答
夕べ風呂に浸かっていたら突然思いつきました。草薙素子風に言うと「ghostが囁く」というヤツです。あ、オレがghostか。

余談ですが、ボクのハンドル名=ghostは、攻殻機動隊とは何の関係もありません。かの作品が映画化されて以降、特に海外の方から「オマエは士郎正宗のファンか?」と聞かれることが増えたのですが、「士郎正宗のファンですけど関係ないです、20年前からghostと名乗ってますんで」と答えてます。

*     *     *

閑話休題。

表題に「自動踏切Ver1.1βの課題の解法がみつかった」と掲げましたが、既に自動踏切Ver1.1βの課題が何であったかがわからない読者諸兄も多いと思いますので、以下にサクッとまとめます。

・遮断機が4つある踏切で、まず左(進入側)が閉じて続いて右が閉じるというアクションを実現したい。
・遮断機と警報機の配置の組合わせ毎にスクロールを用意するのはバカげている。

途中の論理は面倒なので一気に飛躍しますが、突き詰めて一般化すると、この話は・・・

・同じスクロールから同じスクリプトを流し込んだオブジェクトの動作に、後から変化を加えるにはどうすればいいか。

に尽きます。

前回書いたように、VRMスクリプトの仕様上の制約から「連動する踏切部品の数に対応したスクロールを用意しなければならない」は回避できないのですが、同じスクリプトを流しこんだオブジェクトの動作(は原則として同じはずである)に、後から簡単に変化を加えることが出来れば、この問題は回避できます。


で、こういう方法が可能であることに気付きました。まず、以下のスクリプトを組み込むスクロール“Scroll-1”があると思ってください。
[踏切スクリプト]
//SCRWIZ-GLB[Scroll-1]IN
//グローバル変数
Var VarFlag
set VarFlag 0
//SCRWIZ-GLB[Scroll-1]OUT

//SCRWIZ-FNC[Scroll-1]IN
BeginFunc 踏切を閉じる
Var TmpID
ifzero VarFlag
SetCrossingStatus 2
else
SetEventAfter thsi 遅れて踏み切りを閉じる TmpID {遅延時間}
endif
EndFunc

BeginFunc 遅れて踏み切りを閉じる
SetCrossingStatus 2
EndFunc
//SCRWIZ-FNC[Scroll-1]OUT
上掲のスクリプトは説明のために一部を抜書きしたものです。これをそのままコピー&ペーストしても何の意味もありませんので悪しからず。

このスクリプトのミソは、メソッド「踏み切りを閉じる」の2行目の ifzero VarFlag です。変数VarFlag は冒頭で宣言された直後に 0 が set されるのみです。従って、編成を検知したセンサーなどがこのメソッドを call すると、常に ifzero 直後の SetCrossingStatus 2 が実行されることになります。つまり、このスクリプトだけだと続く else 以降の部分、つまり、{遅延時間}だけ待ってメソッド「遅れて踏み切りを閉じる」を実行する部分は、決して日の目を見ることはありません。

が、ここに以下のようなスクロール“Scroll-2”を追加してやるとどうなるでしょう。
[踏切スクリプト]
//SCRWIZ-GLB[Scroll-2]IN
set VarFlag 1
//SCRWIZ-GLB[Scroll-2]OUT
これだけだと何の意味もない上に、Var命令による変数の宣言がおこなわれていないのでエラーになるスクリプトですが、これを上掲のスクリプトが組み込み済みの踏切部品にSCRIPTウィザードから組み込むと、全体としては以下のようになるワケです。
[踏切スクリプト]
//SCRWIZ-GLB[Scroll-1]IN
//グローバル変数
Var VarFlag
set VarFlag 0
//SCRWIZ-GLB[Scroll-1]OUT

//SCRWIZ-GLB[Scroll-2]IN
set VarFlag 1
//SCRWIZ-GLB[Scroll-2]OUT

//SCRWIZ-FNC[Scroll-1]IN
BeginFunc 踏切を閉じる
Var TmpID
ifzero VarFlag
SetCrossingStatus 2
else
SetEventAfter thsi 遅れて踏み切りを閉じる TmpID {遅延時間}
endif
EndFunc

BeginFunc 遅れて踏み切りを閉じる
SetCrossingStatus 2
EndFunc
Scroll-1 のみの場合と異なり、メソッド「踏切を閉じる」が実行される時点で変数 VarFlag の値は 1 になっています。従って、else 以下の SetEventAfter命令が実行され、結果的に{遅延時間}後にメソッド「遅れて踏切を閉じる」が実行されることになります。

この手法を使うと、自動踏切スクロールの組み込み手順は以下のような感じになります。

(1)連動する踏切部品の数(2/4/6/8)に対応したスクロールを選ぶ。
(2)「制御の親踏切」「それ以外の踏切」の区別にだけ注意してスクロールを組み込む。
(3)列車方向表示装置付きの警報機(A〜C)で、親踏切とは反対側にあるものにのみ「自動踏切方向表示反転」スクロールを組み込む。
(4)遅れて閉じさせたい遮断機部品にのみ「自動踏切遅延遮断機」スクロールを組み込む。

最大のメリットは、方向表示機や遮断機遅延動作を利用しなければ手順が簡単になる、という選択肢が生まれることでしょうか。逆にこの手法を使わないと、スクロールの種類がさらに2〜3つ増え、手順(2)が複雑化することになるワケで、まぁ、とりあえず目指していたところにはたどり着けたかな、と思っています。既に簡単なテストは終わっているのですが、もう少しキチッとテストしたいのと、何よりもちゃんとした利用ガイドを整備したいので、公開は週末あたりになりそうです。

*     *     *

この手法は、踏切のように、[1]複数の部品が連動するスクロールで、[2]個々の部品ごとの動作の違いをSCRIPTウィザードで入力するようにすると複雑になり過ぎ、[3]とは言え、それを嫌って入力手順を単純化すると実現したいことが達成されない、ようなケースに応用が出来そうです。具体的には複線駅の出発信号の制御をおこなうスクロールであるとか、複数編成の併結・解放のシナリオを制御するスクロールなどです。

要するに、最初に組み込むスクロールに、その時点では使われもしない無駄なものまで詰め込んでおいて、後から組み込むスクロールでそれを選択的に有効化する、というのが基本的な考え方です。モノによっては使われないコードが大量に組み込まれ「無駄」そのものでもあるんですが、この無駄こそがユーザーフレンドリーを実現するコストでもあるワケです。

まぁ、それでも結局わかんない人にはわかんないし、わかろうとしない人はしないんだけどね。
0

2006/8/17  9:07

投稿者:ghost
> 次の一手

ボクの関心事が鉄道でも鉄道模型でもなく、まさにその一点に尽きることは、ちほ様にはご理解いただいておると思うワケですが・・・え、嘘臭い?(w

これは我々の職場における立ち位置にも関わると思うんですが、ここでいう「汎用化をする(標準化、と言ってもいいですよね)」という思考と、「汎用化したものを使う(ことを推奨する)」という思考の間には、階の違いというか、何か断絶があるように思います。

ともすれば、我々は「汎用化する」ことの意義を論じるか、あるいはそれを出発点に「汎用化したものを使う」ことを論じますが、実は我々が想定している聞き手は、「汎用化する」ことの意義を説かれた時点でオーバーフローを起こしています。そしてこれは聞き手の罪ではなく、説き手側が自らの階の言葉を聞き手の階の言葉に変換し切れないことに起因するように思います。

このギャップを埋めるべくの仕掛けはいろいろやっているつもりではあるのですが、これをやり過ぎると、仕掛けの巧妙さが返って聞き手を硬直させる、というジレンマに陥ります。今、ボクがそこらへんです。

そういうワケで、「次の一手」は、ボクが「打倒しないことには自分たちに明日はない大魔王」になることではないか、とか思っているんですが、もうちょっと勇者がレベルアップしてくれんことには、単なる大虐殺になり兼ねないので躊躇してます。

余談ですが、我らが中隊長殿はまさにこの「大魔王」フェーズだと思っているんですが、我らが大魔王閣下は魔王側の一方的勝利でゲームオーバーになっても構わない、とお考えの節があるので怖いですね(笑)。

2006/8/16  12:37

投稿者:ちほ
何か1つのことを実現するのに、それだけを実現するのならば誰でもできる。(できる人はできる)
でも、それを次に繋がることを前提に工夫することは難しい。(明確な意思がなければできない)

そう高みを目指して汎用化に取り組むわけですが...
そちらのほうは、がんばって着実にストックにたまっていってますよね、実際のところ。

一番の悩みは、汎用化しても誰も使ってくれない...
(何のために汎用化したんだかというジレンマ)

これをどう解くかが命題の1つなのですよねぇ...
何か見えてきてます? 次の一手。

http://chihoizu.blog.shinobi.jp/

2006/8/16  8:33

投稿者:ghost
つまり、趣味でも仕事でも、要求以上の無駄な仕込みはするな、と。いやいや、その点ではちほ様には到底敵わんのですが。>ちほ様

いや、結局ですね。実はドキュメンテーションの方が目的だったりして(ぉぃ)。

P.S. ご依頼の件は後ほどお返事します。

2006/8/15  20:42

投稿者:ちほ
>モノによっては使われないコードが大量に組み込まれ

...で、何のために作ったのか忘れてしまう...
そうならないように

>ちゃんとした利用ガイドを整備したい

情けは人のためならず...ってか?
いやぁ、ホント、ためになるなぁ...

# あ、これが「誉め殺し」ってヤツですか?


http://chihoizu.blog.shinobi.jp/

コメントを書く

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




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