ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

車両の管理方法

連結器のGUIを作ろうとしたけど、課題が見つかってしまい解決策を考え中。どんな課題かというと、この貨物ヤードシミュレータでは最終的に数十両もの貨物車両がいることになるので、連結器の数は下手すると100個以上。これ、どうやってGUIに表示すればいいんだ?一度に1個だけ表示するにしても、どうやって操作したい連結器を速やかに探し出すんだ?

こういうときによく使う解決策は、グループに分けるというもの。例えば、互いに連結された車両は列車とみなし、列車選択→車両選択とすれば選択がかなり楽になりそうだ。ただ、問題は連結判定にある。今回は、こだわりの都合で車両間の連結は完全に物理シミュレーションによっている。そのため、連結されているかどうかの判断はナックル同士の当たり判定に頼るか、車両同士の距離で判定するしかない。ナックル同士の当たり判定は処理が重いので、車両同士の距離で判定するほうがマシではある。しかし、例えば車両が50両あった場合、距離判定は50×49 = 2450回。フレームごとにやるのはちょっと気が引ける量である。

あと、今のシミュレータの初期状態のように、各貨車がバラバラになっていると貨車の数=列車の数になってしまい解決にならない。

ならばどうすればよい?こういう場合の常道は、操作対象をユーザーが操作したいグループのみに絞るという方法だ。このシミュレータの場合、ユーザーが操作したいのは動力車がつながっている列車のみだろう。そして、ユーザーは一度に1両の動力車しか操作できない(という仕様にする予定)。ならば、動力車を起点として、動力車につながっている車両をリストアップすればよい。列車に所属しているかのフラグで枝刈りをすれば、距離判定の回数は最悪でも50+49+・・・1 = 50*(50+1)/2 = 1275回、1編成あたり10両の場合で465回。かなり減った。

列車は線路の上に1次元で並んでいることと前回の判定結果をうまく活かせば、更に判定回数を減らせる気がする。前回列車に含まれていた車両については、隣り合う車両の距離を計測すれば分離判定ができる。あとは両端の車両と未連結の車両との距離をチェックすればいい。このやり方だと、たとえば10両編成ならば隣り合う車両の距離計測で9回、両端の車両と未連結の車両の距離計測で40×2=80回。合計、たったの89回。当初の1/27になった。

ただ、これだけだと横に並んでいるだけの車両が連結判定を受けてしまう。なので、最終的には連結器同士の距離を確認する必要がある。これはワーストケースで列車内の車両数×4回かかるが、先程のように直前の判定結果を活かせば列車内の車両数-1回で済むので問題ない。

あとは、表示方法と連結器開放の指示方法を決めるだけ。

うーん・・・画面下部に、テキストで

□DE10■■WAMU80000_01■■WAMU80000_02□

みたいに表示して、■をクリックすると連結器開放するみたいにしてみるか?難易度は高そうだけどわかりやすい気がする。