https://linen.dev logo
ドア周辺のスクリプトの基礎を教えていただきたいです
# forum
d
誰でも構いませんのでご存じの方いらっしゃいましたらお教えいただけませんか。
p
超基本
Copy code
javascript
entity.doorMoveR//0~40で右ドアの開き具合を取得
entity.doorMoveL//0~40で左ドアの開き具合を取得
0が閉、40が開でRTMのドアのスイッチを押してから2秒間数値が変化します。 RTMの初期スクリプトでは、これにrenderer.sigmoid(entity.doorMoveR/40);などといった処理をすることで単調な変化を0~1で表したものを、シグモイド変換しています(単調変化を以下のグラフのような変化に変換)
RTMのデフォルトのドア開閉で、動作終了付近で若干瞬間移動して見えるのは、このrenderer.sigmoid()に不備があるためです。
知りたい情報がこういうので合ってれば続けます
d
合ってます
p
了解です。
d
お願いします
p
Copy code
javascript
entity.getTrainState(4)
または
Copy code
javascript
entity.getVehicleState(TrainState.TrainStateType.Door)
でドアの開閉を取得できます。これはスイッチが押された瞬間更新されます。 0 : 右閉 , 左閉 1 : 右開 , 左閉 2 : 右閉 , 左開 3 : 右開 , 左開
応用 この値はビット排他的論理和代入やビット論理積を用いることで右扉のみの開閉、左扉のみの開閉に分解可能です。 例① :
Copy code
javascript
var isDoorRopen = (entity.getTrainState(4) & 1) == 1;
var isDoorLopen = (entity.getTrainState(4) & 2) == 2;
1つの関数だったものが、isDoorRopenとisDoorLopenがそれぞれtrue/falseを返すように2つの関数になります。 例② :
Copy code
javascript
//右ドアのスイッチを押した時
var doorState ^= 1;//0:両閉, 1:右開, 2:左開, 3:両開

//左ドアのスイッチを押した時
var doorState ^= 2;//0:両閉, 1:右開, 2:左開, 3:両開
スイッチというのはボタンを押すたびに0と1が繰り返されるもので、ifを使うと、0の時1と1の時0といった分岐を作らなければなりません。さらにこの変数は右ドアの開閉と左ドアの開閉が組み合わせられてるので、分岐はかなり膨らむでしょう。しかし、この様に簡単に値を変化させられます。(実用化するならこの後同期処理が必要ですが割愛)
パッと思いつくのはこれくらいですが何か知りたいことがあれば私が分かる範囲で教えますよ
d
多分そうだと思うんですけどこれの前後ってほかの文とかって必要になって来ますよね
p
じゃあ簡単なドア開閉スクリプトを例示して解説しますね
d
よろしくお願いします
p
※part名はTTK+のものを使用 ※render_doors(entity)をrenderスクリプト内で実行するものとする
Copy code
javascript
function render_doors(entity){
    //ドア移動量をここでまとめておく(単位はm)

    var doorMoveR = 0.0;
    var doorMoveL = 0.0;
        if(entity!=null){//null処理といって、RTMのモデルプレビュー時に発生するentity.~の取得エラーを回避する目的
            doorMoveR = entity.doorMoveR / 60;//右ドアの0~60の開閉状態を0~1に変換
            doorMoveL = entity.doorMoveL / 60;//左ドアの0~60の開閉状態を0~1に変換
        }
    var doorMoveR = renderer.sigmoid(doorMoveR);//これでシグモイド変換をし、実際のドアっぽい挙動になる
    var doorMoveL = renderer.sigmoid(doorMoveL);

    GL11.glPushMatrix();//移動する前の位置を保存
    GL11.glTranslatef(0.0, 0.0, doorMoveR * amount);//ここで移動される
    door_RF.render(renderer);//ここで描画される
    GL11.glPopMatrix();//保存した位置に戻す

    GL11.glPushMatrix();
    GL11.glTranslatef(0.0, 0.0, doorMoveR * -amount);//ちなみにGL11.glTranslatef(Xの移動量, Yの移動量, Zの移動量)
    door_RB.render(renderer);
    GL11.glPopMatrix();//PushMatrixとPopMatrixの数合ってないとクラッシュはしないけど全ての描画が崩れるので注意

    GL11.glPushMatrix();
    GL11.glTranslatef(0.0, 0.0, doorMoveL * amount);
    door_LF.render(renderer);
    GL11.glPopMatrix();

    GL11.glPushMatrix();
    GL11.glTranslatef(0.0, 0.0, doorMoveL * -amount);
    door_LB.render(renderer);
    GL11.glPopMatrix();
}
ちょっと見づらくてすみません。discord以外で、javascriptを表示できるものにて表示させると見やすいかもしれないです。
d
この文を参考にしてドアスクリプトを作ってみてもいいでしょうか
p
どうぞ~
d
完成したら報告しますね
お久しぶりです。
あの後安直な考えでそのままスクリプトに組み込んだのですが
やはりどこか間違ってるようで起動できませんでした
p
クラッシュしたということですか?
d
ワールドには入れたんですがモデル選択する地点でクラッシュしました
p
それであれば、クラッシュレポートを見せて欲しいです
d
どうぞ
p
あと実装されたスクリプトも送って欲しいです
ちなみにrender_door が見つからないとクラッシュレポートは言っています
d
本当にくださったスクリプトを入れたらよさそうなところに突っ込んだだけなんですよね
よろしくお願いします。
p
追加したfunctionはrender_doorsですよね?
function render内で実行してるやつはrender_doorになってますね...
どちらかに名前を揃えてください
あとfunction render_doorsでは(entity)しか引数がないので、実行部でもrender_doors(entity);のみにしてください。
,doorMoveがいらないです
d
うーむ
doorMoveってどこのやつを消したらいいですかね
複数個あるんですけども
p
全部ですねー
render_door(entity, doorMove); ↓ render_doors(entity);
あとこのままだと半透ドアの描画がずれるかと(
d
一旦は本体の方をまともに動かせるようにしたいので動かせるようになったらそっちも着手します
こんな感じⅾですかね
p
そっちに合わせたんですね、function renderのほうもみせてください
d
どこらへんですかね
p
送られたやつですと87行目ですね
して、99行目と114行目にrender_door(entity, doorMove);があるかと
d
Render_ドアあたりだけをいじるものかと
失礼しました
p
render_door(entity, doorMove); ↓ render_door(entity);
d
修正してみました
p
render_doors(entity, ); ↓ render_doors(entity);
d
とりあえず風呂に行ってきます。
一応言われた通りにやってみたのですがどうですか
p
私に言われても(
それで大丈夫かと思うのですが、いかんせんエラー表示出てるのが気になりますね
d
多分ここの/と*がエラー出してるので消した方がいいですかね
p
そこはdoorMoveR,doorMoveL消しちゃダメです
d
いや、そういうわけじゃなくて
赤波線の方ですね
p
ん?
doorMoveR,doorMoveL消したから計算式が成り立たなくなり、エラーが発生しています
d
そういうことでしたか
一応エラーが出なくなるように戻してみました
p
それで機能するんじゃないかなあと思います
d
一旦これでやってみます
起動ができて設置もできたんですけど
なんだか変な感じになりました
p
動きはしました?
d
はい
p
ちょっと数値間違えてしまいました、すみません
doorMoveR = entity.doorMoveR / 40; doorMoveL = entity.doorMoveR / 40; ってやつ、/40じゃなくて/60ですね
d
L方のドアを開けるとどっちも開いちゃうんⅾすよね
修正しました
p
doorMoveL = entity.doorMoveR / 40; ↓ doorMoveL = entity.doorMoveL / 60;
ここも修正お願いします
entity.doorMoveLがRになってしまってました
d
オッケーです
とりあえずしっかり動いたんですが
デフォルトと変わった点がわからないです、、
p
そうですよ
と言っているので、、、
ここがベースの動きで、それから各々いじっていく感じですね
d
ここからカスタムしていくのか
p
あと私はてっきりrenderスクリプトが導入されていない車両の話をしているのかと思ってましたね
renderスクリプトが導入されているのであればそれのドアのfunctionをカスタムしていけばいいのでは
まあ仕組みを理解するという点では効果的であったと思いますが
d
まあまあ構造は負かったので
分かったので
いろいろいじっていきたいですね
p
ちなみにrenderスクリプトを1から導入する場合、以下のスクリプトが必要になります。(これでrenderスクリプトなしのモデルとほぼ同じ動きをします) import package RTMやNGT固有のスクリプトが機能するようにする function init モデルのパーツを定義 function render{ 通常面描画(基本、ドア、パンタグラフ、前面ライト) 透過面描画(窓、ドア窓) 発光面描画(基本、ドア、前面ライト) }
ちょうど再upしたやつとか参考になるかと
d
配布されたものを開けてみたんですけども
文字化けが多くて何が何だかわかりません。。
開扉時のカクつきを頑張って消しました
p
アララ
d
助けていただければ嬉しいです
p
文字コードが違うのかと
変え方とかは知らんです
d
ちなみに白丸の値を変えると何か変わったりするんですか
p
entityがnullの時にその値になります
d
理解です
一応動かせるように指定とかを変えてみたんですけどなぜか起動しないんです
p
んー
今何をされているんですかね
d
今お昼頃配布されていたスクリプトを試しています
p
アレは完成系なので改造する要素はないかと…
コメントに従って組んで欲しいですね
d
あ
p
あ、それが文字化けしてんのか?
d
それが文字化けしてたんですけどさっき別のソフト通したらどうにかなりました
p
ではそのコメントに従ってください
functionはイジることないです 別にイジってもいいですがサポートの範囲外ですね、
d
コメントに従ってやってみても落ちました。
p
あらら
d
いろいろ思考錯誤してもちょっとうまく行かなかったです
p
そしたらスクリプト送って欲しいです
d
ダメそうだったので元の状態に戻しちゃったんですけどいいですかね
p
なら送ってもらわなくて大丈夫です
d
okです
一応partName_LF~RBのやつを定義されてるものに変えたりいろいろしてみたんですけど
あとコメントに書いてあることも一通りやってみました
一応そのまま何も変えずに起動もして見ました
p
言葉だけで言われても分からないので教えて欲しいのであればスクリプトを送ってほしいのと、ダメそうで元に戻したけど教えて欲しいのであれば再度同じことをして送ってください。
d
分かりました。再度同じことをして送ります。
p
えっと
functionに引数ってあるのわかりますか?
d
はい
p
function render_doors(entity,pass,_door_LF... ってあったらentity,pass,_door_LF...が引数です
んでそれらを実行する時に引数を数値を指定しないといけないのですが
されてないっていうか、そもそも実行されてないですね
コメントの部分に例を載せたはずですので活用してください
function render(entity, pass, _par3)内の、 render_door(entity); ↓ render_doors(entity,pass,door_LF,door_LB,door_RF,door_RB,0.64,2000,1000,0.5,0,1000,true);
d
一応言われた通りの所に数値を指定したのですが置くとクラッシュします
ダメそうなところってありますかね
p
クラッシュした場合はクラッシュレポートもお願いします
d
p
さっきもいったのですが、 function render_doors(entity,pass,partNameLF,partNameLB,partNameRF,partNameRB,amount,delay1,count1,per,delay2,count2,sigmoid){ の内容をいじられると大変困ります。
それすらまともに起動できていない状態で、改造しようとしないでください
d
え
そこの変更が必要なのかと
失礼しました
p
違うんですよね
d
戻しておきます
p
partNameLFってあると思いますが
実行部でそこに前左ドアを指定するだけで、functionの部分は変えちゃダメなんですよね
d
申し訳ないです
p
実行部っていうのはfunction render(entity, pass, par3)にある render_doors(entity,pass,door_LF,door_LB,door_RF,door_RB,0.64,2000,1000,0.5,0,1000,true);のことです
d
本当に無知なもんで
p
これは他のRTMer向けに、簡単にドアの動きを変えられるように、実行部でカスタムできるようにしたんですよね。例としてはかえってわかりにくかったですかね、すみません。
その点で中級者以上向けと書いてます
d
たしかに中級者以上じゃないと多少引っ掛かりそうですね
今回は変えたらいけないところは変えてないと思うのですがクラッシュしました
見てもらえませんか
p
render_door(entity,pass,door_LF,door_LB,door_RF,door_RB,0.64,2000,1000,0.5,0,1000,true); ↓ render_doors(entity,pass,door_LF,door_LB,door_RF,door_RB,0.64,2000,1000,0.5,0,1000,true);
sついてないです
d
本当だ
p
()の前までは、functionと同じでないとだめです。 ちなみに、()の中は、functionの()の中の要素にそれぞれ対応したものが入ってないとダメです
クラッシュレポートは、Caused by:の後を見ます。今回の場合、 Caused by: javax.script.ScriptException: ReferenceError: "render_door" is not defined とあるので、実行しようとしているfunction render_doorが見つからないと読み取れます。
d
function render_doorに当てはまる項目って215行目と326行目くらいにしかないし末端にsがついてるんですけど末端のsって消したほうがいいですかね
functionの範囲内なのでよくなかったです
どこにfunction render_doorを入れたらいいかちょっとわからないんですけど教えていただければ嬉しいです
p
これじゃダメですか
これが全てなので、これで起動できるなら他に言うことはないです
d
動きました
ありがとうございます
あとはエラーを吐かない程度に数値を変えていったりして慣れていきます
ありがとうございました
2 Views