AKAGI Rails

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

ATENXA公開しました。

ATENXA - Advanced Toolkit for Enhancing VRMNX by AKAGI

akagi-rails.github.io

Discordで先行公開しておりましたが,VRMNXpyで多彩なギミックを実現するPythonパッケージATENXA(アテンジャ,もしくはアテンザ)を公開しました。撮る夫くんに引き続き,githubリポジトリ内で管理しております。

主要な機能

現時点で出来ている主要な機能です。

自動踏切

今回,こちらの実装が一段落したので初回のリリースをしました。遮断機の動作遅延や,方向表示機の点灯に対応しています。単線・複線に限らずどんな配線のパターンにも対応しています。

スクリプトの組み込みは,基本的に1アイテム1行で,簡単です。Pythonのリストや辞書といったデータ形式のことはほとんど意識せずに,ほぼコピペで動くものを仕立てられるようにしました。詳しいことはチュートリアルをご覧ください。

漆黒さん,ばんえつラインさんに早速ご使用いただいています。

失礼ながら申し上げると,漆黒さんはたぶんお年も召しておられるはずで,Pythonベースのスクリプトで使ってもらえるかしら…と不安に思っていた部分があったわけですが,多少お手間をかけさせてしまいましたが無事作動に漕ぎ着けられたとのことで,まず感服している次第でありますが,簡単に組み込める仕様を徹底した甲斐があったなと安心しているところです。

ATENXA式イベントシステム

ワンライナーの簡単機能組み込み以外に,スクリプトが自分で書ける人向けの便利な機能も持っています。

VRMNXのイベントの取り扱いは,旧バージョンに比べて難化しています。VRMNXpyの設計自体,どういう実装をユーザーにさせたいのかあまりハッキリしない気がするので,こういうものを用意してみました。

ざっくり言えば,旧バージョンのイベントシステムのような感覚で,時間系イベントを定義することが出来ます。特徴として,実行する関数だけでなく,そこに渡す引数を一緒に指定することが出来ます。例えば,AfterEventであれば

AfterEvent(1.5, trn.SetTimerVoltage, args=(5.0, 0.2))

を実行すると,1.5秒後に

trn.SetTimerVoltage(5.0, 0.2)

が実行されます。

例えばですが,センサー検知,減速・停止,数秒後発車,みたいな動作をセンサーのスクリプトへの記述だけで完結するような実装も可能です。 もちろん自動踏切もこのイベントシステムに依存しています。(というか,自動踏切がこのイベントシステムの実証実験みたいな感じです。)

NXになってKillEventがなくなりましたが,ATENXAの中ではこれも使えるようにしました。これでウザいフラグ管理からはおさらばできます。たぶん。

レイアウト固有の実装をATENXA式イベントシステムで行うには,レイアウトスクリプトricheventを記述する必要があります(VRMAPIからのイベントの橋渡しになります)。マニュアルも割と一生懸命書いたので,ぜひこれを使っていろんなギミックを作ってみてください。

ログ出力

中身は他でもなく,昔記事にしたものを取り入れました。

akagi.hateblo.jp

新しく,標準Pythonのpprintの機能を模擬した, pprintLOG も用意しました。 リストや辞書を見やすく整形してログに出力できます。もっぱら自分がデバッグに使ってます(爆

スプライトのラッパーと速度計

VRMNXのスクリーンスプライトは実装が気に入らないので全部ラッパを書きました笑

スクリーンスプライトを使用した速度計も作って,これもワンライナーで簡単に組み込めるようにしました。

シンプルな速度計

akagi-rails.github.io

MeterSimpleの正体はクラスです。中身に,スプライトを初期化するメソッドや,速度を取得してスプライトを表示するメソッドを持っています。ということで実は,だれでもこのクラスを継承して必要部分のコードをオーバーライドすることにより,好きなリソース画像を使った速度計を作ることが出来ます。 興味のある方はGitHubで実装も見てみてください

凝ったこともやろうと思えば出来ます。atenxaをインポートして何某かの仕掛けを作る例として,後日このサンプルをご紹介するつもりです。

どこかで見たことあるような・・・

計画中の機能

ATENXAは他にもいくつかの機能を計画中です。

時隔式信号機など簡易ギミックシリーズ

TOMIXのTCS信号機のように,列車通過から一定時間で赤→黄→青のように現示がアップする信号機のギミックを予定しています。ただし,ちゃんとしたモジュールになるかどうかは未定です。そんなに難しくないので,atenxa.richeventを使ったコーディングのサンプルとして供するかもしれません。

簡易ギミックシリーズとして,他に,解放ランプ付きレール(みたいなセンサー)も検討中です。

自動運転

これまたTOMIXのTCS自動運転ユニットか,もしくはA列車で行こう9でいうところの「個別発車」によらないシンプルなダイヤ設定の機能か,そのあたりを参考にすると思いますが,自動運転の機能は実装したいと思っています。

ダイヤ運転は,ダイヤを外部ファイルに用意して読み込むなどして実現できる可能性は高そうですが,検討事項も多いので将来課題です。

閉塞制御

信号機と連動するATSとかATCが,当面のATENXAのゴールです。旧バージョンで開発にチャレンジしていたakg/2.0シリーズでは,追い越しまではなんとか作ったものの折り返し運転に対応できずに終わってしまいましたので,そこもリベンジしたいですね。

ATENXAのネーミングはATACSにあやかった*1ところでもありますが,移動閉塞をやる気はありませんw

一度プロトタイプは作ってみたのですが,組み込みの手間の削減を徹底すべく,1からやり直しています。

おわりに

以上,初回リリースに付けた機能に加えて,色々と風呂敷を広げるような話もしてみました。今のところ,ここに書いたようなことしかアイデアになっていないので,「他にこういうことがしたい!」というアイデアをお持ちの方は,コメント,Discordチャンネル,GitHubなどでお寄せ願います。また,ATENXAではリクエストやバグレポートのみならず,GitHubのシステムを活用してプルリクエストも歓迎します。これはPythonという汎用言語と融合したVRMNXならではの成長の仕方の1つと思われ,チャレンジしてみる価値があるはずです。マージするかは気分次第ですが(笑)

*1:開発初期は閉塞制御をメインに考えていたので,「ATなんとか」にNXをねじ込むことを考え,某自動車みたいな名前になりました。Advanced Toolkit...は後付けですw