VRM入道

VRM侍は出家しますた(w    カリカリ

 
投稿者
メール

 
コメント
URL
コメントは新しいものから表示されます。
コメント本文中とURL欄にURLを記入すると、自動的にリンクされます。
投稿者:ghost
それが正解です。>MtdRelaySectionBlock
メソッドの命名センスもお見事。

> 出発・場内信号

については、区間閉塞が完成したのち、その応用として実現します。基本的な理屈は閉塞信号と同じです。

何かご自身で試みたいことがあれば、とりあえずはやってみるのがいいんじゃないでしょうか。意図通りに動作するのであれば、ボクの解説する手法に拘泥する理由はありませんから。
投稿者:ゆゆぽん☆
[センサー]
Var SigCtrl
SetEventSensor MtdRelaySectionBlock SigCtrl


BeginFunc MtdRelaySectionBlock

call ObjSignal1 MtdSectionBlock

EndFunc

[信号]
//閉塞実施メソッド
BeginFunc MtdSectionBlock
//灯火色切替メソッドを実行
call this MtdSignalR
//
EndFunc

で動きました。
> あと、場内信号のSignal5,6は、今のところ
> 本線用のSignal5連動させています。

は、信号6個とセンサー5個ありますが、
(場内信号機の部分がかぶる為)
1個のセンサーで操作することは考えず、
信号、センサー5組としてすべて閉塞信号の
扱っているという意味です。出発・場内信号は
全くスクリプトを書かない状態でいたほうがいい
ですか?説明が下手ですみません。
投稿者:ghost
最初よりも悪くなりました...orz

ここを自力で突破しないことにはこの後の課題は絶対に解決できないので、敢えてサンプルコードは示しません。以下の説明を読んで再挑戦しましょう。

1. 今やりたいことは、センサーを編成が通過したら何か(信号の閉塞)が起こる、です。
2. センサーが編成を検知した際、何かを起こすには、SetEventSensor命令をつかって、センサーのメソッドを実行します。
3. が、信号の閉塞処理自体は、センサーではなく信号側のスクリプト(メソッド)でやらなくてはなりません。
4.そこで、センサー側に中継用のメソッドを作ります。名前は何でもいいです。
5. この中継用のメソッドの中から、信号側の閉塞処理のメソッドを実行(call)しましょう。

以上です、頑張って。


ちなみに。

> あと、場内信号のSignal5,6は、今のところ
> 本線用のSignal5連動させています。

まったく意図がわかりません。場内/出発信号については12回目以降に解説する予定です。基礎を理解しないうちに、結果を焦るのはお奨めできません。

ボクにはゆゆぽん☆殿が今作っているレイアウトが見えていない、ということを忘れないでください。あなたが基礎を押さえないままに独自に書いたスクリプトがおかしな動作を起こしても、ボクにはそれを解決することは出来ません。
投稿者:ゆゆぽん☆
すみません、訂正です。
SIG1の変数はObjSignal1〜6です。

投稿者:ゆゆぽん☆
[センサー]
//Var命令で宣言
VarSignal SIG1
get SIG1 Signal1

call SIG1 MtdSectionBlock
[信号]
//閉塞実施メソッド
BeginFunc MtdSectionBlock
//灯火色切替メソッドを実行
call this MtdSignalR
EndFunc

だと最初から赤になってしまうので、
信号のスクリプトをセンサーに移して
thisを変数に変えたうえ、
SetEventSensorを使うと動きはするのですが、
後からのスクリプトに支障をきたさないか心配
です。あと、場内信号のSignal5,6は、今のところ
本線用のSignal5連動させています。
投稿者:ghost
第一に、SetEventSensor命令は、自分自身(つまり、この命令を含むセンサー)に所属するメソッドしか実行できません。

第二に、センサースクリプトで宣言した信号オブジェクト変数ObjSignalは、宣言しただけで使ってないですよね。これは、call ObjSignal MtdSectionBlock とすることで“このセンサーが担当する信号の閉塞メソッドを実行する”ための準備だったはずです。

以上のヒントで考えてみましょう。

ちなみに信号スクリプトの、

> Var VarSignal
> set VarSignal SIG1

は要らない(使ってないですよね、実際)ので消しておいた方が後で混乱しなくて良いかも。黄/緑点灯用のメソッドはそれで正しいです。
投稿者:ゆゆぽん☆
やっぱりセンサーを踏んでも赤に変わりません。

[センサースクリプト]
//Var命令で宣言
VarSignal ObjSignal
get ObjSignal Signal1

Var SigCtrl
SetEventSensor MtdSectionBlock SigCtrl

[信号スクリプト]
//Var命令で宣言
Var VarSignal
set VarSignal SIG1

//信号灯火色管理変数
Var VarSignalColor
call this MtdSignalG

//灯火色設定メソッド
BeginFunc MtdSignalR
set VarSignalColor 1
SetSignal VarSignalColor
EndFunc

BeginFunc MtdSignalY
set VarSignalColor 3
SetSignal VarSignalColor
EndFunc

BeginFunc MtdSignalG
set VarSignalColor 6
SetSignal VarSignalColor
EndFunc

//閉塞実施メソッド
BeginFunc MtdSectionBlock
//灯火色切替メソッドを実行
call this MtdSignalR
EndFunc

赤に変えるメソッドはできていると思うのですが
何が足りないのでしょう?
投稿者:ghost
KSMaster殿の実装は、スクリプトを読んだので存じ上げています。

この連載で紹介するのは、言わば“別解”で「列車が区間に入るとき1を足して、出るときに1を引く」のような、恣意的な変数を用いずに、閉塞を実現する方法です。必要な変数は、各信号の灯火色を記録するそれと、イベント変数1つだけでいけます。

分岐後の処置については、連載12〜13回あたりで書きますので、それを読んでください。すくなくとも、この課題については、恣意的な管理変数を使うよりも、ghost流の方が格段にスマートに記述できると思います。

ただ、誤解のないように明言しておきますが、ボクのスタンスはあくまでも「意図通り動けばOK」です。他のロジックで同じことを実現する人を否定するつもりはありません。それぞれの実装の長所短所は遠慮なく論じます。が、優劣を論じるつもりはありません。

でも・・・製品付属のスクロールはいくらなんでもあんまりだと思ってる(苦笑)
投稿者:KSMaster
 僕は、列車が区間に入るとき1を足して、出るときに1を引くという方法で閉塞に対する矛盾は解決しましたが、待避を行うようにすると分岐される手前の信号の動作が気になります。
 列車が待避線に止まっている状態で、停まっていない本線にポイントを切り替えても、後ろの信号は待避線に列車が止まっていることを表示するので、本線に入る列車からみるとおかしな現象が生じます。。

http://ksmaster.sblo.jp/
投稿者:ghost
これはボクの言葉足らずですね。>call this MtgSignalG には意味があるのでしょうか?

VRMの信号機はビュワー起動時に無灯火です。
何もしなければ、センサーが編成を検知し、メソッドMtdSignalRが実行されるまで、どの色も灯火していない状態になります。

それだと不自然なので、とりあえず信号を青にしておきましょう、が、メソッドの外側(宣言部)にあるcall this MtdSignalGの意図です。

で、肝心のメソッドMtdSignalGは、MtdSignalRからの類推で自分で作ってみてね、というのが意図だったのですが、改めて読み直すと、これはちとわかりにくかったですね。

要するにMtdSignalGは、MtdSignalRとメソッド名、および変数VarSignalColorに代入する値が異なるだけで、他は同じメソッドです。

同様に、MtdSignalYも用意しておいてください。次回以降で必要になりますので。
1|2

実験的代物

CSS無効化 ここで知った方法を使ってます

真・世界征服新着情報

今月のお勤め

2008年
← July →
Sun Mon Tue Wed Thu Fri Sat
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
Copyright (C) GMO Tea Cup Communication, Inc. All Rights Reserved.