VRM入道

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

 
投稿者
メール

 
コメント
URL
コメントは新しいものから表示されます。
コメント本文中とURL欄にURLを記入すると、自動的にリンクされます。
投稿者:ghost
気にしなくていいです。>先に言うべきでしたね・・・すみません

言葉を選んでいると伝わるモノも伝わらなくなるので、特に何らかのスキルの伝達を狙っているときは語感が強い言葉を使わざるを得ません。

万が一、ボクがこの企画に嫌気が差した場合は多分黙って止めますから、続けて書いている限りは、基本的に感情を害していることは一切ないとお考えいただいて結構です。

逆に、語気を強くお感じになった際は、その部分は、ボクの感情の発露ではなく、最も(VRMスクリプトを制する上で)重要なツボがそこにあるのだ、とお考えいただきたく。
投稿者:ゆゆぽん☆
先に言うべきでしたね・・・すみません。
信号編でも色々あるかもしれませんが、
よろしくお願いします。
投稿者:ghost
祝着至極。
でも・・・

> 編成のスクリプトには、ポータブル編成
> スクリプトやその他のWizardをつかった
> スクリプトが書かれていて

それ、先に言おう...orz

メソッドの外、いわゆる“宣言部”と呼ばれる部分は、各オブジェクトのスクリプト先頭から「最初のBeginFuncまで」が実行されます。ご注意あれかし。

ちなみに、ご理解いただけているとは思いますが、100や250には特に意味はありませんので、ゆゆぽん☆殿の使いやすい数値に改めて使ってください。

明日から信号編が始まります。
投稿者:ゆゆぽん☆
動きました!
編成スクリプトの
Var VarType
set VarType 100(あるいは250)
の記入場所が悪かったのかもしれません。
編成のスクリプトには、ポータブル編成
スクリプトやその他のWizardをつかった
スクリプトが書かれていて、その最後に
記入していたのを1番上にやったら解決しました。
Var宣言は最初でないといけないんですね・・・。
あと、センサースクリプトに
DrawVar TmpType を追加したら、
int 0だったのが、100と250、それぞれ表示され
ポイントも動きました。ありがとうございました。



投稿者:ghost
構文的には間違いはないです。また、今、ボクのVRM環境でゆゆぽん☆殿の示したコードを組み込んでみたら意図通りに動作しました。

となると、怪しいのはセンサーの配置、ポイントの名前です。

(1) センサースクリプトの mov TmpType TmpTrain.VarType の直後に DrawVar TmpType を追加してみましょう。

センサーが編成を検知していれば、ログウィンドウにTmpTypeの値、すなわち検知した編成のVarTypeの値が表示されるはずです。

何も表示されないとすると、センサーにレールと異なる高さが設定されてしまっていて、編成が検知できていない可能性があります。

(2) ポイントの名称を再確認してみましょう。ゆゆぽん☆殿のコードでは“West”と名づけられたポイントをセンサーが制御することになっていますが、実はテストで走行しているポイントが“East”だった、というオチも、ないとは思いますが可能性としてはありえます。

また、レイアウト上に“West”と名づけられたポイントが複数ある場合も考えられます。同名のオブジェクトが複数ある場合、VRMはその名前で最初に見つかった部品に対してのみ制御をおこなおうとします。そのせいで制御が空振りしている可能性があります。


パッと思いつく可能性はこんなところです。

コメントのやり取りでは「部分」しか見えないので、最悪、メールにレイアウトを添付して送ってください。
投稿者:ゆゆぽん☆
やはりおかしいです。
[ポイントスクリプト]
//Var命令で宣言
Var TmpType
Var VarTrainType
set TmpType 250

BeginFunc MtdCheckType

ifeq VarTrainType 250
call this MtdTurnout
else
call this MtdStraight
endif

EndFunc

だと、分岐すらしてくれません。
[編成スクリプト]
Var VarType
set VarType 100(あるいは250)
を記入してグローバル変数宣言はしているのですが・・。

>ボクをVRMビュワー代わりに使うな、ということです
言葉不足だったようで誤解を与えてしまいました。あのスクリプトでビュワーを起動すると、問題なく
立ち上がりますが構文が無視されてしまいます。
この文法は間違いなのでしょうか?
という意味だったのですが、誤解を与えてしまいました。すみませんでした。
投稿者:ghost
多分それで動作します。
が、おそらく誤解されている部分があると思うので補足します。

> ifeq TmpType VarTrainType

は、素直に書けば ifeq VarTrainType 250 です。これは「もし、VarTrainTypeの値が250に等しければ」の意です。

ゆゆぽん☆殿の書き方を同様に読み下すと「もし、TmpTypeの値がVarTrainTypeに等しければ」になります。これをゆゆぽん☆殿が意識的にそうされたのであれば特段申し上げることはありませんが、もし、上に読み下したようなことを意識しておられないか、あるいは他のことを考えておられた場合は、今後のために注意が必要です。

また、変数名TmpTypeは、ここまでの流れで「センサー部品におうて、検知した編成のグローバル変数の値を一時的に取得しておくローカル変数」として使われたものです。

動作上は実害ありませんが、異なる用途に対しては異なる変数名を割り当てることをお奨めします。そうしないと、後で読み返したときに、どの変数が何を意味しているのか著しくわかりにくくなります。

それから、今回のように「動作はするけれども後日の災いの元になると思われる記述」については指摘しますけれども、基本的にはVRMスクリプトは多少まずい書き方をしていようが、意図通りの動作をすればそれでOKと見做して良いと思います(他の人に教授する場合を除く)。

何が言いたいかというと、ボクをVRMビュワー代わりに使うな、ということです。

VRMビュワーは、文法/名前解決がまずければ起動時エラーで、論理がまずければ意図せぬ動作をすることで、あなたの書いたスクリプトが正しくないことを教えてくれます。まずは、それを試みましょう。自分で動作を試みていないコードについて「こんな感じでしょうか?」と尋ねられるのは、ボクとしては望むところではありません。
投稿者:ゆゆぽん☆
こんな感じでしょうか?

//Var命令で宣言
Var TmpType
Var VarTrainType
set TmpType 250

BeginFunc MtdCheckType

ifeq TmpType VarTrainType
call this MtdTurnout
else
call this MtdStraight
endif

EndFunc
投稿者:ghost
if命令の使い方はそれで正しいです。

最初に示されたコードをそのままお使いなのだとすると、ここで評価されている変数TmpTypeに目的の値(編成オブジェクトでsetした値)が運べていないのが意図通りに動かない原因です。

> //[d']ポイントのグローバル変数にTmpTypeの値を代入
> mov ObjPoint.VarTrainType TmpType

は、変数ObjPointが指すポイントに所属する変数VarTrainTypeに、自分自身(ここではセンサー)に所属する変数TmpTypeの値を代入せよ、の意になります。

したがって、ポイント側にこれを受け取る変数VarTrainTypeがないといけません(Var命令で宣言する)し、if命令で比較する変数はこれでないといけません。

多分、これで意図通り動作すると思いますよ。
投稿者:ゆゆぽん☆
説明不足でした。

ifeq TmpType 250
call this MtdTurnout
else
call this MtdStraight
endif
EndFunc

で、
TmpTypeと250が等しい時、
ここにあるMtdTurnoutを実行する
それ以外は
ここにあるMtdStraightを実行する

と思ったのですが・・・外れたようです。
if文は、
もし〜ならば、○○を実行する。
と思っているのですが間違いなのでしょうか?


1|2

実験的代物

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

真・世界征服新着情報

今月のお勤め

2008年
← September →
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        
RSS
Copyright (C) GMO Tea Cup Communication, Inc. All Rights Reserved.