2006/10/30

【何か】シリーズを作ってみよう(その14)  【何か】スクロール
前回へ戻る>

この連載の最終回です。

ここまでで“【何か】センサー”から受け取るパラメーターに応じて、

・0〜300であれば速度(Km/h)と解釈し、編成の加減速性能に準じてその速度まで加速または減速する。
・301以上であれば停車位置までの距離(Nゲージmm)と解釈して減速→停車し、一定時間後に再発車する。
・-1以下であればその絶対値を停車位置までの距離と解釈して減速→停車し、一定時間後に方向転換してから再発車する。

が“【何か】この速度で走れ”に組み込まれました。【何か】シリーズとしてはこれで十分完成なのですが、どうせならばこのスクロールを自動運転の万能スクロールとすべく、以下のオマケ機能を組み込むことにします。

(1) あるキーを押すと、編成がアクティブになる。
(2) キーを押したときに編成が停車していた場合、発車する。

この機能を加えることで、【何か】センサーが適切に配置されているレイアウトであれば、カーソルキーによる運転操作を一切しなくても、スクロールのみで出発を含むすべての速度制御を賄えることになります。


では最初に「キー」をユーザーに選択させるためのスクロールの「keyセクション」の書き方を紹介しておくことにしましょう。と言っても、たったこれだけのことなんですが。

key
{
name WizKey
guide "編成をアクティブに切り換えるキー。停車中にキーを押した場合、編成が出発する。"
}

例によって黄色部分が、スクロール作者であるあなたが書き換えるべき部分になります。name要素は、スクリプト側でSCRIPTウィザードによって選択されたキーを受け取るときに使う名前です。具体的には“SetEventKey”命令の4つ目の項目に使うことになります。guide要素はSCRIPTウィザードに表示される説明ですね。

では、スクリプトの中身を見ていくことにしましょう。まずは、編成スクリプトにキーイベントを設定する部分を書き加える必要があります。これは、いわゆる「初期化処理」としておこなう必要がありますから・・・

//↓独自の初期化処理(グローバル変数宣言等)はここで

Var VarParameter //パラメータ保存用
Var VarFlag //折り返し運転フラグ
Var IDEvent //イベントID
Var VarStartVoltage //減速開始時の電圧
Var VarStartTime //停車・再出発所要時間
Var IDKey //キーイベントID
SetEventKey this subActive IDkey WizKey


//↑ここまで

前々回、いくつかグローバル編成を書き加えた部分の末尾に、黄色で示した部分を更に加えてやります。

イベントIDを受け取る変数IDKeyを宣言した上で、さきほどkeyセクションでSCRIPTウィザードによる選択を可能にしたキーWizKeyを使ってSetEventKey命令によるキーイベント設定をしていることがおわかりいただけますか。後は、キーが押されたときにcallされるメソッド、ここではメソッドsubActiveを作れば完成です。

BeginFunc subActive
//
//キー処理メソッド
//
//編成をアクティブにする
VarTrain TmpTrain
get TmpTrain this
SetActiveTrain TmpTrain
//現在速度を取得
Var TmpSpeed
GetCurrentSpeed TmpSpeed
//停車中ならば・・
ifzero TmpSpeed
//イベントを無効化
KillEvent IDevent
//最高速度の9割を算出
GetTopSpeed TmpSpeed
mul TmpSpeed 0.9
//出発
mov VarParameter TmpSpeed
call this subSpeed
endif
EndFunc

上掲がそのメソッドsubActiveです。冒頭三行はオマケ機能(1)編成がアクティブになる、のための部分です。編成オブジェクト変数“TmpTrain”を宣言し、“get”命令でTmpTrainに自分自身(this=この編成)を取得、最後に“SetActiveTrain”命令で変数TmpTrainが示す編成=自分をアクティブにしています。この三行は、編成スクリプトからアクティブ切替をおこなう際の定石ですので、覚えておいて損はありません。

以下はオマケ機能(2)「停車していた場合、発車する」のための部分です。まず、停車しているかどうかを調べるために、ローカル変数TmpSpeedを宣言し、“GetCurrentSpeed”命令で現在速度を取得しています。これが0であれば停車中、ということですね。これを判断するために、続く“ifzero TmpSpeed”があります。以降“endif”までの部分は、変数TmpSpeedが0、つまり停車中に限り実行されることになります。

ここで最初におこなっていることは“KillEvent”命令によるイベントの無効化です。これは、前回解説した「駅停車→方向転換→再発車」の処理との相性を鑑みてのものです。このスクロールを組み込んだ編成が停車しているというのは「ビュワー起動直後」か「ユーザーが手動操作で停車させた」か、あるいは「駅停車→方向転換→再発車の処理の途上」であるか、のいずれかになります。そして、最後のケースの場合、停車中はSetEventAfter命令によって設定されるイベントが設定されていますから、これを放置して発車させると、発車後に方向転換や再発車処理が実行される、というおかしな事態になってしまいます。これを防ぐためにイベントの無効化をおこなっているワケです。

以下は出発の処理になります。独自に出発のための処理を書いても良いのですが、せっかく目標速度を与えれば加減速性能に応じて加減速するメソッドsubSpeedが既に組込み済みなので、これを使うことにします。ここでやっているのは、“GetTopSpeed”命令で得た編成の最高速度を0.9倍し、これをグローバル変数VarParameterに代入してからメソッドsubSpeedをcallする、という処理です。これにより、メソッドsubSpeedは、あたかも【何か】センサーから「最高速度の9割の速度をパラメーターとして与えられた」もの、として振る舞いますから、結果的に現在速度=0Km/hから目標速度=最高速度の9割を目指して、加減速性能に応じて加速を開始することになります。

*     *     *

かくして、編成速度の制御については万能となる“【何か】この速度で走れVer2.00”が完成しました。連載記事を辿っていただければご自身で書けると思いますが、それが面倒な方のために、ダウンロードできるようにしておきます。

[Donload]
【何か】センサーVer1.00
【何か】この速度で走れVer2.00

※【何か】センサーは、何をするときも共通ですので、既にダウンロード・インストール済みの方には不要なものです。

以上、14回に分けて編成ギミック(速度制御)を操作する【何か】シリーズスクロールの作り方、考え方を解説してきました。少し間を空けてから、今度は車両ギミック(ライト消点灯等)を扱う【何か】シリーズの書き方を解説しようかと思います。

読者諸兄に「こういうアイデアを実現する過程を書いて欲しい」というリクエストがあれば、早い者勝ちでそれを題材に書こうと思いますので、何かあればコメント欄にでも書き残してください。また「こういう【何か】シリーズが欲しいから作ってくれ」というリクエストも常時受付ておりますので、よろしくです。
0

コメントを書く

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




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