2005/9/17

目指せ完全自動運転(9)−構内減速/停車センサー  VRMスクリプト禅問答
難易度:☆☆☆

今回は、前回紹介した距離指定減速メソッドを使って、駅に列車を止めてみましょう。単に止めるだけで良いのであればセンサーは1つで良いのですが、ある理由から敢えてセンサーを2つ使っています(これについては詳しくは明日)。まずは下の配置図をご覧ください。

クリックすると元のサイズで表示します
<部品配置図>

こんな感じで配置します。図の中で@、Aで示している部分の長さが意味を持ってきますので注意しておいてください。
まずは、編成スクリプトに前回紹介したものに加えて、更に下に示すコードを組み込んでください。
[編成スクリプト]
//イベント用変数
Var TimerID
//徐行速度設定
setf StdVarSpeedSlowDown 10.0
//
//構内減速メソッド
//
BeginFunc StdMtdStationSlowDown
//換呼メッセージ
ifeq VarActive 1
DrawMessage "「場内、停車位置確認!!」"
endif
//速度更新
ifeq VarAutoMode 1
call this MtdSlowDown
endif
EndFunc
//
//停車メソッド
//
BeginFunc StdMtdStationStop
//換呼メッセージ
ifeq VarActive 1
DrawMessage "「停車!!」"
endif
//速度更新
ifeq VarAutoMode 1
SetTimerVoltage 0.0 3000
//出発用イベント登録(明日解説予定にて今回はコメントアウト)
//SetEventAfter this MtdWaitDeparture TimerID 5000
endif
EndFunc
基本的には「信号を換呼する」の回で紹介したメソッドと同じものです。つまり、列車がアクティブであれば運転士の発声を表示し、自動運転モードであれば前回紹介した距離指定減速メソッドを実行する、というものです。
ポイントは、変数StdVarSpeedSlowDownに10.0(Km/h)という恣意的な値を設定していることです。これは、メソッドMtdSlowDownの実行で列車を停止するのではなく、10Km/hまで減速することを意味しています。
メソッドStdMtdStationStopについては後ほど改めて。

これを、上掲図中の「減速用センサー」から実行します。こんな具合に。
[減速用センサースクリプト]
//停止用センサーまでの距離(m)
Var VarToStopSensor
setf VarToStopSensor 200.0
//内部使用変数
VarTrain ObjTrain
//イベント定義
Var EventID
SetEventSensor MtdSenseTrain EventID
//
//編成検知イベント
//
BeginFunc MtdSenseTrain
GetSenseTrain ObjTrain
call this MtdSlowDownTrain
EndFunc
//
//編成減速メソッド
//
BeginFunc MtdSlowDownTrain
mov ObjTrain.StdVarSlowDownDistance VarToStopSensor
call ObjTrain StdMtdStationSlowDown
EndFunc
ポイントは変数VarToStopSensorに代入されている値です。ここでは200.0にしていますが、これはこのセンサーから「停車用センサー」までの距離が200mであることを意味しています。この距離が上掲図のAの長さです。この値をメソッドMtdSlowDownTrainの冒頭で編成の公開プロパティStdVarSlowDownDistanceに放り込むことにより「減速用センサー通過後、200m走行して速度が10Km/hになる」が実現されることになります。
なお、この距離は当然あなたがどのようなレイアウト(駅構内)を作るかによって変わります。配置ツールの距離計測を使うとセンサー間の距離を知ることが出来ます。ただし、ここでわかる値は単位がmmであり、かつNゲージスケールのものなので、0.15をかけて単位mかつ実スケールに換算する必要があります。

この結果、列車はAだけの距離を走って、つまり「停止用センサー」の位置まで来て速度が10Km/hになります。後は、
[停止用センサースクリプト]
//出発信号定義
VarSignal ObjPartnerSignal
//get VarPartnerSignal "{出発信号名}" // 2005/10/11 誤謬修正
get ObjPartnerSignal "{出発信号名}"
//内部使用変数
VarTrain ObjTrain
//イベント定義
Var TimerID
Var EventID
SetEventSensor MtdSenseTrain EventID
//
//編成検知イベント
//
BeginFunc MtdSenseTrain
GetSenseTrain ObjTrain
call this MtdStopTrain
EndFunc
//
//編成駅停車メソッド
//
BeginFunc MtdStopTrain
get ObjTrain.StdObjSignal ObjPartnerSignal
call ObjTrain StdMtdStationStop
//出発用イベント登録(明日解説予定にて今回はコメントアウト)
//SetEventAfter this MtdWaitSignalG TimerID {停車時間+3000}
EndFunc
列車がコレを踏めば、編成スクリプトのメソッドStdMtdStationStopが実行され、10Km/hから3秒かけて停止するので、前回の公式に当てはめると・・・

3秒 = 2s / ( 10km/h + 0Km/h )
 s = 4.16m → Nゲージ換算で 約28mm

停車位置からレイアウター上で28mm手前に停止用センサーを置いておけば、ピタッとそこに止めることが可能になります。この28mm(実スケール4.16m)こそが上掲図の@の距離であることはもうおわかりですね。
では、なぜ敢えて減速用センサーで一発で止めずに二段階にしているのか。これは列車の再出発との関係によるのですが、長くなってきたので本日はここまでとしましょう。

質問やご要望があれば気軽にコメント欄に書き込んでください。特に「ここの意味がよくわからないのでもっと詳しく」という指摘は大歓迎です、なぜわかりにくいのかの理由が添えられていると特に。
0

2005/10/11  21:25

投稿者:ghost
念のために伺いますが、この回(目指せ完全自動運転(9)−構内減速/停車センサー)のスクリプトだけを入力していませんか?
本連載で示しているスクリプトはそれぞれの回までに紹介したスクリプトに依存するので、連載で紹介しているスクリプトすべてを組み込む必要があります。
少なくとも、StdVarSpeedSlowDownは第8回、VarActiveとVarAutoModeは第5回で紹介している編成スクリプト内で宣言されたものなので、これらをこの回で紹介しているスクリプトと合わせて入力する必要があります(機能ごとに分けて掲載しているのでつまみ食いは不可能ではありませんか、それなりのスクリプトスキルを必要とします)。
とりあえず以下のリンクから「目指せ完全自動運転シリーズ」だけでも第1回から通しで一度読んでいただいた方が良いのではないかと。

http://silver.ap.teacup.com/applet/ghost/msgcate9/archive

2005/10/11  20:58

投稿者:ひろと
停止用センサーのエラーはなくなりましたが今度は
[6] ERROR 未定義の変数[StdVarSpeedSlowDown]
[12] ERROR 未定義の変数[VarActive]
[16] ERROR 未定義の変数[VarAutoMode]
[25] ERROR 未定義の変数[VarActive]
[29] ERROR 未定義の変数[VarAutoMode]
ERROR OBJECT : [6] 編成配置
というエラーが出ています。

2005/10/11  19:40

投稿者:ghost
私の変数名の書き間違えが原因でした、切腹。
[誤]VarPartnerSignal→[正]ObjPartnerSignalです。ご指摘に多謝。他にもおかしなところがあったら遠慮なく突っ込んでください。

2005/10/11  17:35

投稿者:ひろと
[3] ERROR 未定義の変数[VarPartnerSignal]
ERROR OBJECT : [13] センサーというエラーが出ます。

2005/10/10  21:06

投稿者:ghost
もう少し詳しく。>ひろとさん
「ああなるはずなのにこうなった」とか「〜というエラーが出る」等の情報をお願いします。

2005/10/10  19:27

投稿者:ひろと
[停止用センサースクリプト]
//出発信号定義
VarSignal ObjPartnerSignal
get VarPartnerSignal "{出発信号名}"
の"{出発信号名}"
信号機名いれても動きません

コメントを書く

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




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