AKAGI Rails

鉄道模型シミュレーターで遊んでいたはずが、気づいたらPythonなども。

VRMNXpyで205系のドア開閉

VRMNXpy(Pythonベースの新しいVRMスクリプト)を書いて,新たに実装されたドア開閉機能のある205系を実際に動作させてみた。指定距離停止をやってみた回ではセンサーでイベントを発生させたが,今回はキーイベントを使用する。

注意VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点(v6.0.0.25)でのものである。>

今回の実装のターゲットは次のとおりである。

  • Z/Aキーで左側のドアを開閉
  • X/Sキーで右側のドアを開閉

ただしドア開閉をするのは操作対象の編成に限る。方向転換を伴うと「左右」は入れ替わる可能性があるが,今回はこのことは考慮しない。

では書くべきコードを見ていこう。レイアウトに配置した編成部品(TRAIN_36)のスクリプトに書くものとする。(イベントハンドラ名についた番号に注意。)レイアウターツールの,▼ツールオプション▼プロパティ▼スクリプトからエディタが開ける。例によって,インデントは半角スペース4つとする。(TABは使えないっぽい。)

(Ver. 6.0.0.20βでは編成クラスのSetEventKeyDownとIsActiveが(マニュアルにはあるのに)実装から抜けていたが,最新版ではちゃんと動くようになった。)

#OBJID=36 編成部品
import vrmapi
def vrmevent_36(obj,ev,param):
    if ev == 'init':
        # キーイベントの設定
        obj.SetEventKeyDown('A')
        obj.SetEventKeyDown('S')
        obj.SetEventKeyDown('Z')
        obj.SetEventKeyDown('X')
    elif ev == 'broadcast':
        dummy = 1
    # -- 中略 --
    elif ev == 'keydown':
        # ドア操作
        if param['keycode'] in ['A', 'S', 'Z', 'X']:
            if obj.IsActive():
                door_switch(obj, param['keycode'])

def door_switch(obj, key):
    if key == 'A':
        obj.CloseDoor(0, False)
    elif key == 'Z':
        obj.OpenDoor(0, False)
    elif key == 'S':
        obj.CloseDoor(1, False)
    elif key == 'X':
        obj.OpenDoor(1, False)

はじめに,イベントハンドラのinitセクションでキーイベントを設定している。これはビュワーの初期化段階で一度実行される。vrmevent_36の中では,objはID=36の編成部品を参照する。obj.SetEventKeyDown('A')のようにキーイベントを設定すると,この編成部品を対象にキーイベントが発生することになる。

キーイベントを設定しておくと,キーが押されたときに引数evに'keydown'を伴ってイベントハンドラが呼び出されてきて,elif: ev == 'keydown'とあるパートが実行される。ここでは,当該オブジェクトが操作対象であることをobj.IsActive()を使って確かめ,押されたキーparam['keycode']がドア操作に割り当てられたキーであることを確かめてから,別で定義したdoor_switch関数を呼び出す。

関数door_switchは,ドア開閉の対象となるobjと,keyを引数として,ドア操作をする。elifはelse ifの略であり,インデントがシンプルになる。これだけでもPythonを好きになる理由に事足りるだろう。

door_switchの中身はイベントハンドラの中にべた書きしてもよい。しかし,VRMNXpyはどんなのか・2での調査から分かる通り,TRAIN_36に書いたdoor_switch関数は,レイアウト内のどこからでも呼び出せる。したがって,新しく配置したTRAIN_37でもキーでドア操作をしければ,イベントハンドラの部分のみ書き加えればよい。

:;;;:+*+:;;;:+*+:;;;:+*+:;;;:+*+:;;;:+*+

v6.0.0.25のリリースノートによるとスクリプトの基本仕様が固まってきたということなので,VRMNXでどんなギミックができるのか,これからさらに探りを入れてみたい。

(冒頭の動画は実は更新前のバージョンで撮ったもので,レイアウトにキーイベントを設定してから,ブロードキャストで編成部品のイベントハンドラを呼び出して動かしている。ブロードキャストの使用方法ものちのち紹介したいと思う。)

次回もすでに準備が進んでおり,ユーザー定義のクラスを用意して踏切を動かす例を紹介する予定。