見出し画像

Rosso Laboratory

踏切スクリプト完成


VRM5仕様なのでそのままでは使えないかもしれないですし、全くのオリジナルとして検討したので参考に出来る部分はないかもしれませんが、こっそりと作りました。こっそりと公開します(^_^;)

LAYOUT
Var crossarea01    //踏切区間に 0:いない、1:1編成、2:2編成

C57
Var train_way
BeginFunc direction
 GetDirection2 train_way
EndFunc


EF81
Var train_way
BeginFunc direction
 GetDirection2 train_way
EndFunc


CROSSINGSIGN_LEFT
SetCrossingStatus 1
BeginFunc crs_close1
 Var a
 GetCrossingStatus a  //状態取得
 ifeq a 1   //踏切が開いていたら
  SetCrossingStatus 2 //踏切を閉じる
 endif
 ifeq LAYOUT.crossarea01 1 //踏切区間に1編成だったら
  SetCrossingSign 1 //方向1を表示
 else
  SetCrossingSign 3 //それ以外なら矢印両方向を表示
 endif
EndFunc

BeginFunc crs_open1
 ifeq LAYOUT.crossarea01 0 //踏切区間にいないなら
  SetCrossingStatus 1 //踏切を開く
 endif
 ifeq LAYOUT.crossarea01 1 //踏切区間に1編成だったら
  SetCrossingSign 2 //方向2を表示
 else
  SetCrossingSign 0 //それ以外なら消灯
 endif
EndFunc

BeginFunc crs_close2
 Var a
 GetCrossingStatus a  //状態取得
 ifeq a 1   //踏切が開いていたら
  SetCrossingStatus 2 //踏切を閉じる
 endif
 ifeq LAYOUT.crossarea01 1 //踏切区間に1編成だったら
  SetCrossingSign 2 //方向2を表示
 else
  SetCrossingSign 3 //それ以外なら矢印両方向を表示
 endif
EndFunc

BeginFunc crs_open2
 ifeq LAYOUT.crossarea01 0 //踏切区間にいないなら
  SetCrossingStatus 1 //踏切を開く
 endif
 ifeq LAYOUT.crossarea01 1 //踏切区間に1編成だったら
  SetCrossingSign 1 //方向1を表示
 else
  SetCrossingSign 0 //それ以外なら消灯
 endif
EndFunc


CROSSINGSIGN_RIGHT
SetCrossingStatus 1
BeginFunc crs_close1
 Var a
 GetCrossingStatus a  //状態取得
 ifeq a 1   //踏切が開いていたら
  SetCrossingStatus 2 //踏切を閉じる
 endif
 ifeq LAYOUT.crossarea01 1 //踏切区間に1編成だったら
  SetCrossingSign 2 //方向2を表示
 else
  SetCrossingSign 3 //それ以外なら矢印両方向を表示
 endif
EndFunc

BeginFunc crs_open1
 ifeq LAYOUT.crossarea01 0 //踏切区間にいないなら
  SetCrossingStatus 1 //踏切を開く
 endif
 ifeq LAYOUT.crossarea01 1 //踏切区間に1編成だったら
  SetCrossingSign 1 //方向1を表示
 else
  SetCrossingSign 0 //それ以外なら消灯
 endif
EndFunc

BeginFunc crs_close2
 Var a
 GetCrossingStatus a  //状態取得
 ifeq a 1   //踏切が開いていたら
  SetCrossingStatus 2 //踏切を閉じる
 endif
 ifeq LAYOUT.crossarea01 1 //踏切区間に1編成だったら
  SetCrossingSign 1 //方向1を表示
 else
  SetCrossingSign 3 //それ以外なら矢印両方向を表示
 endif
EndFunc

BeginFunc crs_open2
 ifeq LAYOUT.crossarea01 0 //踏切区間にいないなら
  SetCrossingStatus 1 //踏切を開く
 endif
 ifeq LAYOUT.crossarea01 1 //踏切区間に1編成だったら
  SetCrossingSign 2 //方向2を表示
 else
  SetCrossingSign 0 //それ以外なら消灯
 endif
EndFunc


CROSSINGBAR_LEFT
SetCrossingTime 3000
SetCrossingStatus 1
BeginFunc crs_close
 Var a
 GetCrossingStatus a  //状態取得
 ifeq a 1   //踏切が開いていたら
  SetCrossingStatus 2 //踏切を閉じる
 endif
EndFunc

BeginFunc crs_open
 ifeq LAYOUT.crossarea01 0 //踏切区間にいないなら
  SetCrossingStatus 1 //踏切を開く
 endif
EndFunc


CROSSINGBAR_RIGHT
SetCrossingTime 3000
SetCrossingStatus 1
BeginFunc crs_close
 Var a
 GetCrossingStatus a  //状態取得
 ifeq a 1   //踏切が開いていたら
  SetCrossingStatus 2 //踏切を閉じる
 endif
EndFunc

BeginFunc crs_open
 ifeq LAYOUT.crossarea01 0 //踏切区間にいないなら
  SetCrossingStatus 1 //踏切を開く
 endif
EndFunc


SENSOR_IN_IN
Var evid
SetEventSensor snsev, evid
SetSensorMode 0

BeginFunc snsev
 VarTrain obj
 GetSenseTrain obj
 call obj direction
 ifeq "C57.train_way" 1
  add LAYOUT.crossarea01 1
  DrawVar LAYOUT.crossarea01
  call "CROSSINGSIGN_LEFT" crs_close1
  call "CROSSINGSIGN_RIGHT" crs_close1
  call "CROSSINGBAR_LEFT" crs_close
  call "CROSSINGBAR_RIGHT" crs_close
 endif
EndFunc


SENSOR_IN_OUT
Var evid
SetEventSensor snsev, evid
SetSensorMode 1
BeginFunc snsev
 VarTrain obj
 GetSenseTrain obj
 call obj direction
 ifeq "C57.train_way" 1
  sub LAYOUT.crossarea01 1
  DrawVar LAYOUT.crossarea01
  call "CROSSINGSIGN_LEFT" crs_open1
  call "CROSSINGSIGN_RIGHT" crs_open1
  call "CROSSINGBAR_LEFT" crs_open
  call "CROSSINGBAR_RIGHT" crs_open
 endif
EndFunc


SENSOR_OUT_IN
Var evid
SetEventSensor snsev, evid
SetSensorMode 0
BeginFunc snsev
 VarTrain obj
 GetSenseTrain obj
 call obj direction
 ifeq "EF81.train_way" 1
  add LAYOUT.crossarea01 1
  DrawVar LAYOUT.crossarea01
  call "CROSSINGSIGN_LEFT" crs_close2
  call "CROSSINGSIGN_RIGHT" crs_close2
  call "CROSSINGBAR_LEFT" crs_close
  call "CROSSINGBAR_RIGHT" crs_close
 endif
EndFunc


SENSOR_OUT_OUT
Var evid
SetEventSensor snsev, evid
SetSensorMode 1
BeginFunc snsev
 VarTrain obj
 GetSenseTrain obj
 call obj direction
 ifeq "EF81.train_way" 1
  sub LAYOUT.crossarea01 1
  DrawVar LAYOUT.crossarea01
  call "CROSSINGSIGN_LEFT" crs_open2
  call "CROSSINGSIGN_RIGHT" crs_open2
  call "CROSSINGBAR_LEFT" crs_open
  call "CROSSINGBAR_RIGHT" crs_open
 endif
EndFunc

まぁ一応作れたので内容は理解できたから何かの役には立つことでしょう。
PVアクセスランキング にほんブログ村


ランキングに参加中。クリックして応援お願いします!

コメント一覧

rosso_laboratory
配信がんばってください。楽しみにしています(^^)/
nanatsuiro
こんばんは。お世話になっております。

ご制作くださいました「踏切スクリプト」の「VRM 4」での動作確認のための利用許可をくださいまして、ありがとうございます。
近日中に、鉄道模型ライブ配信を予定し、「VRM 4」で制作した当方の踏切レイアウトに組み込んでみて、動作できるかを試させて頂きたく思います。

今後とも、どうぞよろしくお願い申しあげます。
rosso_laboratory
こんにちは、ななついろさん(^^)/ 裏でこっそりやってて申し訳ありません(^_^;) このスクリプトの利用及び改変はご自由にどうぞ。ご質問の「obj」についてですが、もうVRMスクリプトはほぼ忘れてしまったので分かりません(^_^;) 動画内で検証していただければと存じます。それでは(^^)/
nanatsuiro
こんばんは。「ななついろ」と申します。
当方がVRM4で、かなり苦労していた踏切複線制御のスクリプト例を、こっそりご制作くださっていたのですね。スクリプトを拝見させて頂きましたが、とても綺麗にスッキリとまとめられています。特にセンサーが8個使われているのに、センサーのスクリプトとしては進入用の「IN-IN」と脱出「OUT-OUT」を同じスクリプトでまとめられ、結果的にセンサーは4種類のスクリプトで済むというところが、効率が良いなと思いました。

当方のスクリプトでは、外回り線と内回り線の車両の進行方向を格納するグローバル変数をふたつ用意していましたが、これも「LAYOUT」のスクリプトに「Var crossarea01」と、ひとつで済むのですね。

かなり効率が良く、大変参考になりました。わざわざ、ご制作くださり、お礼を申しあげます。

センサーのスクリプトで「ifeq "C57.train_way" 1」と「ifeq "EF81.train_way" 1」のように、編成名の直接指定がございますが、これを直前の「GetSenseTrain obj」で取得した変数名「obj」を用いて「ifeq obj.train_way 1」のようには出来ないのでしょうか?

編成名の指定に「ifeq obj.train_way 1」のような事が出来たら、踏切のスクリプト自体が編成名に依存しなくなり、汎用性が高くなります。つまり、踏切をレイアウトに設置したら、追加した編成のスクリプトに「GetDirection2 train_way」を追加するだけでよくなり、踏切のスクリプトは全く編集しなくても済むようになります。

こちらのスクリプトは「VRM5」で、ご制作との事ですが、「VRM4」でも正しく動作するか試してまいりたくなってまいりました。

今後の「当方の鉄道模型ライブ配信」で、zio様ご制作の「踏切スクリプト」を使用させて頂く事は可能でございますでしょうか?ご検討くだされば、嬉しく思います。

大変長文となり、失礼いたしました。
今後ともどうぞよろしくお願い申しあげます。
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「VRMスクリプト」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事