ビューわかしお氏のアイデアを実現してみよう(1-1)
ビューわかしお氏が示してくれたアイデアを実現する方法を考えてみようと思います。まずは,実現したいことを簡単にまとめてみます。
(1) 編成のランダム連結: 途中の車庫のある駅で,到着した列車に増結編成をランダムに選んで増結する
(2) キーで番号を入力してカメラや編成を切り替える: 数字キーで二桁以上の数を入力して,対応する番号の編成に切り替える
(1)については,新幹線ランダム走行システムが転用できそうです。車庫にいるたかだか有限(現実的には,数本)の編成を一つ選び,動かしてやります。ポイント制御は,自動センサーを併用すると楽でしょうね。
「車庫にいる編成を一つ選ぶ」のは,次のようなスクリプトでできますね。最もシンプルな例として,2本の増結編成のうちどちらか一方が動き出すとするためには,基本編成の到着後に実行されるようなメソッド内で,
Var rand irnd rand mod rand 2 ifeq rand 0 call "TrainE231" MtdGo endif ifeq rand 1 call "TrainE233" MtdGo endif //<以下省略>
のようにしてやればOK。(もちろん,増結編成には,動き出すようなメソッドMtdGoを仕込んでおく。)
ミソはおなじみのmod命令で,2で割ったときの余りが0か1で場合分けをしています。
レイアウトの演出としてこれを組み込む場合,増結編成がくるのをただ待たされていたのでは退屈なので,後半のifeq文の中身を
ifeq rand 0 SetActiveTrain "TrainE231" endif
のようにしてしまい,プレイヤー自身に基本編成まで入れ替え運転させて連結させてしまうのもよいでしょう。
♪:;;;:♪:;;;:♪:;;;:♪:;;;:♪:;;;:♪:;;;:♪:;;;:♪:;;;:♪:;;;:♪:;;;:
(2)について。VRM2の頃にはすでに,数字キー(またはアルファベットキー)を押して編成やポイントの切り替えをする機能はありましたが,VRM5では色々な仕掛けを起こすための別の目的のキーイベントと干渉するおそれがあるため,編成切り替えのためにいくつものキーアサインを使うのはよろしくありません。そこで編成に1,2,3,...,9,10,11,...と番号をつけ,「その番号を入力→数字とは別の決定キーを押して切り替え」という仕掛けにしようというアイデアでした。これには,いくつかのハードルがあります。
- キーイベントは使えそうだがそのままでは数字1文字ずつである。どのようにして2ケタ(以上)の数字を入力,確定させるか。
- 確定した数字をどのように編成オブジェクトに対応させるか。
ひとつめは,種別コードキューで2進数でしていたことを10進数バージョンでおなじようにやれば良さそうです。1~9,0キーでの入力はその都度「もとの数を10倍して,入力された数字を足す」ことによってできそうです。ほかに[決定]キー(ここではpキー),打ち間違えたとき用の[クリア]キー(qキー)を使って,実装します。
ふたつめは,はじめは番号入力をオブジェクトIDとすることで,考えないことにしましょう。
Var evkey1 SetEventKey this MtdInput1 evkey1 1 // 以下省略。適当にキーイベントを設定する。 Var TrnNo //編成番号の変数(初期値=0) BeginFunc MtdInput1 mul TrnNo 10 add TrnNo 1 DrawMessage "編成切り替え番号入力中" DrawVar TrnNo DrawMessage "[q]クリア [p]決定" DrawMessage "" EndFunc BeginFunc MtdInput2 //以下省略 ... EndFunc BeginFunc MtdInputClear set TrnNo 0 EndFunc BeginFunc MtdInputEnter SetActiveTrain TrnNo // 入力したオブジェクトIDの編成に切り替える set TrnNo 0 // 終わったら初期化をお忘れなく EndFunc
レールやストラクチャを配置するとVRMシステムはそれらに通し番号を振っていきます。編成部品も例外ではなく,通し番号が振られます。これがオブジェクトIDです。その番号を入力させることにして,そのままSetActiveTrain TrnNoとするやり方です。
実装は簡単ですが,レール・ストラクチャも含めた通し番号ですから,何番を入力したらどの編成になるか覚えるのが大変です。編成以外の番号を入力してしまった場合は切り替えが空振りします。
かといって,先程の編成増結のときのように,1,2,3,...と編成ごとの番号を考え,MtdInputEnterの中でif文を連ねるのは,今回編成数が多い場合を想定していますから現実的ではありません。
- 入力すべき番号は1,2,3,...の通し番号にしたい
- しかし,番号とオブジェクト参照とを対応させるため多くの編成でスクリプトを書く手間はかけたくない
そんなアナタのための方法は,稿を改めてお話することにしましょう。
| 固定リンク
「VRM:研究」カテゴリの記事
- VRMNXの時間系イベントが使いにくいなあと思っているアナタへ(2019.12.24)
- [VRMNX] フレーム同期の話(2019.07.18)
- [Python] リスト型をベクトルに見立てて計算したい(2019.06.16)
- VRMNXのレイヤーベース地形を使ってみよう(前編)(2019.05.18)
- [VRMNX]自動踏切モジュール(2019.01.25)
この記事へのコメントは終了しました。


コメント