ApplySwitch > If

カスタマイザを条件付で使う

■ スイッチで仕様切り替えとか、カッコいいよね!

 スイッチはRailsim2の目玉機能です!
 ひとつのPIでいろんな形態、仕様が細やかに再現できるようになりました。
 これを活用しない手は無いでしょう!
 てなわけで、今回はスイッチを含むいろんな条件を指定してカスタマイザを動かす方法です。

■ で、どうしたらいいの?

 ここで使う構文は2種類あります。
 まずはプログラム系でもおなじみIf文。
If 条件式 {
  動かしたいカスタマイザ
}
 条件式が正しければ、中身を実行するって奴です。簡単ですね。
 Railsimでは条件式の値が0でないとき、とちょっとばかし違いますが。
 ちなみにこんな形にすることで……
If 条件式 {
  動かしたいカスタマイザ1
} Else {
  動かしたいカスタマイザ2
}
 「指定した条件が成り立つ時」と「成り立たない時」の両方の動作を決めることができます。

 そしてもうひとつ、スイッチに対応させる上で主力になるであろうApplySwitch文。
ApplySwitch 条件式 {
  Case XX (, YY ) :
    動かしたいカスタマイザ
  Default:
    動かしたいカスタマイザ
}
 こちらは、「条件式の値がCaseに続く値と等しい時続くカスタマイザを実行する」とゆー仕様になっております。
 ひとつのCaseにカンマを使って複数の状態を記述することも出来るし、Caseを増やしてもっと分岐を増やすことも出来ます。
 またDefaultはどのCaseにも当てはまらなかった時の動作を書くんですけど、これはなくても動きます。

 Railsimで使えるのはこの2種類だけ。たった2種類ですが、組み合わせ次第でいろんなことができます。

■ 条件式ってなんなのさ

 たぶんここで躓く人が多いと思われます。
 自分は他人の構文をコピペしながら体感的に習得したんですが、あえて説明を試みることにしましょう。

1. スイッチの名前を書く。

 これだけでもひとつの条件式として成立します。
 If文ならば最初の選択肢か、それ以外か。
 ApplySwitch文ならば、どの選択肢かで分岐させることができます。
 一番使う機会が多いかもしれません。

2. システムスイッチの名前を書く。

 スイッチにはいくつかRailsim側が値をもっているものがあります。それがシステムスイッチ。
 これを活用することで、進行方向や速度、時間や季節など多くの情報を得ることが出来ます。
 利用できるシステムスイッチは以下。
名前 得られる情報 状態と値
"_FRONT" 車両PIでのみ使えます。
車両の進行方向が前後どちらかがわかります。
前を向いている時は0
それ以外は1
"_CONNECT1" 車両PIでのみ使えます。
車両の前方に連結車両があるかどうかがわかります。
前方に連結車両があれば1
なければ0
"_CONNECT2" 車両PIでのみ使えます。
車両の後方に連結車両があるかどうかがわかります。
後方に連結車両があれば1
なければ0
"_DOOR1" 車両PIでのみ使えます。
左側のドアを開くべきかどうかがわかります。
左側のドアを開くべき時は1
そうでなければ0
"_DOOR2" 車両PIでのみ使えます。
右側のドアを開くべきかどうかがわかります。
右側のドアを開くべき時は1
そうでなければ0
"_SERIAL" 車両および地形PIで使えます。
車両なら所属する編成の番号、地形ならシーンの番号がわかります。
それぞれ0から数えた数
"_CAMDIST" 全てのPIで使えます。
レイアウト上において視野角45度の時の、視点とPIの距離がわかります。
単位は[m]
小数点以下四捨五入の実数
"_VELOCITY" 車両PIでのみ使えます。
その時の車両の速度がわかります。
単位は[km/h]
小数点以下四捨五入の自然数
"_ACCEL" 車両PIでのみ使えます。
その時の車両の加減速度がわかります。
単位は[m/h/s]
小数点以下四捨五入の整数で、加速時は正、減速時は負
"_CABINVIEW" 車両PIでのみ使えます。
その時の視点がその車両の運転席にあるかがわかります。
あるときは1
無い時は0
"_APPROACH1" 駅舎PIでのみ使えます。
プラットホームに定義方向と同じ向きの列車が接近しているかがわかります。
ちょっとややこしいので詳細は省略
"_APPROACH2" 駅舎PIでのみ使えます。
プラットホームに定義方向と逆向きの列車が接近しているかがわかります。
ちょっとややこしいので詳細は省略
"_STOPPING" 駅舎PIでのみ使えます。
プラットホームに列車が停止しているかがわかります。
ちょっとややこしいので詳細は省略
"_NIGHT" 全てのPIで使えます。
その時昼か夜かがわかります。
昼ならば0
夜ならば1
"_SEASON" 全てのPIで使えます
その時の季節がわかります。
春は0
夏は1
秋は2
冬は3
"_SHADOW" 全てのPIで使えます。
Railsimの影描写が有効かどうかがわかります。
有効ならば1
それ以外は0
"_ENVMAP" 全てのPIで使えます。
Railsimの環境マッピングが有効かどうかがわかります。
有効ならば1
それ以外は0
"_YEAR" 全てのPIで使えます。
Railsim内での年がわかります。
Railsim内での年
"_MONTH" 全てのPIで使えます。
Railsim内での月がわかります。
Railsim内での月
"_DAY" 全てのPIで使えます。
Railsim内での日がわかります。
Railsim内での日
"_DAYOFWEEK" 全てのPIで使えます。
Railsim内での曜日がわかります。
Railsim内で
日曜日なら0
月曜日なら1
火曜日なら2
水曜日なら3
木曜日なら4
金曜日なら5
土曜日なら6
"_HOUR" 全てのPIで使えます。
Railsim内での時がわかります。
Railsim内での時
"_MINUTE" 全てのPIで使えます。
Railsim内での分がわかります。
Railsim内での分
"_SECOND" 全てのPIで使えます。
Railsim内での秒がわかります。
Railsim内での秒

3. 演算子を活用する

 例えば、あのスイッチが3番で昼の時だけ動かしたい、といった時に、IF文やApplySwitch文を何段も重ねてもいいんですが、なにしろ読みにくいしあんまり美しくないですネ。
 そういうときにひとつのIf文で済ませられるかもしれない方法があります!
 それが演算子です。
 これをマスターすれば相当な武器になりますよ!

 ただ、あんまり深くやるとややこしすぎるし筆者も全部習得してるわけじゃないので、よく使われるものだけぱぱっと紹介することにしまーす。
 これだけでもいろんなことができるはずです。
記号 名前 機能 使い方
() 括弧 くくられた内側の演算を優先する。 優先したい演算を括弧でくくる。
! 否定 右辺が0なら1、それ以外なら0を返す。 逆にしたい式、スイッチ名の左にくっつける。
< 小なり 左辺が右辺より小さければ1、それ以外は0を返す。 比べたい式、スイッチ名ではさむ。
> 大なり 左辺が右辺より大きければ1、それ以外は0を返す。 比べたい式、スイッチ名ではさむ。
<= 以下 左辺が右辺以下ならば1、それ以外は0を返す。 比べたい式、スイッチ名ではさむ。
>= 以上 左辺が右辺以上ならば1、それ以外は0を返す。 比べたい式、スイッチ名ではさむ。
== 等和 左辺と右辺が等しければ1、それ以外は0を返す。 比べたい式、スイッチ名ではさむ。
!= 不等和 左辺と右辺が異なれば1、それ以外は0を返す。 比べたい式、スイッチ名ではさむ。
&& 論理AND 両辺がいずれも1ならば1、それ以外は0を返す。 比べたい式、スイッチ名ではさむ。
|| 論理OR 両辺のどちらかが1ならば1、それ以外は0を返す。 比べたい式、スイッチ名ではさむ。
 うーん、多いなw
 ところで、演算子はそれぞれ優先順位が違います。といっても、括弧が一番上、否定子がその下、比較演算子がさらにその下、論理演算子が一番下、ぐらいなものですが。
 まとめて演算したい部分は全部括弧でくくってやると読みやすさ的にもよいかと思います。

■ 結局これで何ができるの?

 このWikiでの例では、これとか、これとか、大体は見た目の切り替えに使われます。
 手元のPIの定義ファイルを覗いてみると、もっといろいろな使われ方をしてると思いますよ。

 では、がんばってください!

名前:
コメント:

すべてのコメントを見る
最終更新:2016年07月06日 03:08
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。