啓明氏の近作「9尾の雷鳥」が面白い。
未だに根強いファンの多い英国製の人形劇特撮シリーズ「Thunderbird」をイメージしたと思われる方向幕や、意味ありげに幾何学的なトラックプラン、妖怪もどきのネーミングセンス・・・もさることながら、ひねくれ者の拙者の心を捉えたのは、以下のスクリプトなので御座候。
BeginFunc Cst
GetCurrentVoltage v
SetTimerVoltage v acctime2
EndFunc
啓明氏作/9尾の雷鳥編成スクリプトより
これは「現在速度を維持」する役割を果たすメソッドである。当然だと思う人にとってはそうなのかも知れないが、その発想に拙者はちょっとした衝撃を受けてしまった。
軽く解説しておくと、変数vにGetCurrentVoltageで現在の電圧(・・・じゃないけど、詳しくは
こちら)を取得し、続くSetTimerVoltageで列車の電圧を変数vに指定する、という記述である。え、現在の電圧になれと指定する?
ここが氏の発想のユニークなところだと感心するのだが、この作品では走行制御用に他に2つのメソッドが用意されており、それぞれ「最高速まで加速する」「停止まで減速する」になっている。つまり、このレイアウトを作者の意図通りに操作する限りにおいては、列車は停止中か最高速でなければ常にSetTimerVolatageによる加減速の最中なのだ。
この「加減速の最中」に前述のメソッドが実行されるというのがミソである。実はこのメソッドは文字通り「現在の電圧になれと指定する」のだが、実際の役割は「現在おこなわれている加減速をキャンセルする」ことにある。SetTimerVoltageが、他のあらゆる運転操作を無視して動作し続ける(方向転換でさえ・汗)こと、そして同じ編成に連続して2回使われた場合は先に実行された命令が無効になる、という仕様を利用しているわけだ。
天晴ッ!!
以下余談。
このメソッドのもうひとつのパラメータ、すなわち電圧vまでの到達時間となる変数acctime2が、この作品では10(ミリ秒)になっている。先に実行中のSetTimerVoltageの効果をキャンセルするのが目的であれば0であって良さそうなものだが、恣意的な値が入っているのには何か他に理由があるに違いない、と踏んで試してみた。
どっひゃーッ!!
そういうワケで、皆さんもSetTimerVoltageの時間指定を0にしてはいけない、ってことを覚えておいて欲しいので御座候。ご自身のPCスキルに自信のない方は追試しないように。
あと、I.MAGiC殿には対処をよろしくで御座る。SetTimerVoltageが変数を評価する際、未代入を0と評価するのであれば、結構発現率の高い問題と思われる也。