マップの通行設定についてのメモ

今マップエディタを作ってる。

元々RPGツクール的なものをjgforceでサポートするつもりでいたので、その下準備としてjgame.jsのTileクラスをRPGで使えるレベルにしようかなと思ったのが発端。


動いてるもんはここで。
http://jgforce.com/game/53
ソースはjgforceにログインしてからこのURLで見れる。
http://jgforce.com/editgame/53/8


横道。
このマップエディタを作る過程でjgforceにTypeScriptエンジンってのをサポートした。
再生はさすがに無理だけど、ピュアなTypeScriptが書けるエンジン。俺もマップエディタは直接jgforceで編集してる。
Visual Studioが重い、Sublime Text2じゃコマンド補完が出ないとか嘆いてる人は使ってみてください。多分複数ファイルを一つのJSにビルドするツールとしては、現存するTypeScriptの編集ツールの中でもビルド速度は最速クラスだと思う。
まあVisual Studio動く人ならVisual Studioのがいいんだけども。


横道終わり。
んで、このマップエディタを作っていると、マップの通行設定どうするかというのを考えることが多いんだけど、調べてるとこれが案外複雑。
なので今日はマップの通行設定についてちょっと考える。

マップでの移動

最初にマップでの移動についてなんだけど、ゲームにおける移動は大雑把にいえば「瞬間移動」と「普通の移動」の二つだろう。
x, yの地点に移動する、というのと、x1,y1の地点からx2,y2の地点に移動する、の二つ。


x, yの地点に移動するには、xとyの場所に移動出来るかどうかという判定をクリアする必要がある。
x1, y1からx2, y2の地点に移動するには、x1, y1から順にx2, y2までの道のりを見て、全部移動出来るかどうかってのの判定が必要。


例えば、こういう事。


通常の移動は普通の移動であるべきで、これをちゃんとやらないと、特に時間ベースのエンジンの場合痛い目にあったりする。
jgforceのサンプルであがってるシューティングゲームなんかはすべて瞬間移動なので、弾が直前まで来てもう駄目だってなっても、経過時間を増やす手段さえ見つければ瞬間移動で局面打開が可能になったりする。

マップチップの移動設定

で、こういう移動を管理するために、マップチップの移動設定ってのが必要になる。
2DのRPGの場合、代表的なのは二つだと思う。


一つは、単純にそのチップが移動可能か、不可能かというもの。
ファミコン時代なんかはほとんどこれだったと思う。


もう一つは、チップごとに移動可能かのデータを4つ持たせるというもの。
上に移動可能か、右に移動可能か、下に移動可能か、左に移動可能かの四つ。要はcssのborderのような境界線で管理してる。
この場合はこういうチップが表現出来る。

  _ 
 |o| 

oの地点にはいけるけど、oの地点からは下からしか入れなくて、oの地点に入ると下からしか出れない。
王座とかをこういう形にすると、大分それっぽくなる。
これを移動可能か不可能かだけで表現しようとすると、周辺チップを移動不可能地形にしないといけないので、このborder型の管理方法が今は主流かなと思う。

ウディタの例

Wolf RPGエディター(以下ウディタ)というのが最近フリーゲーム界隈ではかなりの勢力を持っている。
http://www.silversecond.com/WolfRPGEditor/
俺もすごく好きなツール。願わくば20年前に出会いたかったがw*1


RPGツクールが築いてきたインディーズゲームの文化を受け継いでいるツールなので、俺もよく参考にさせてもらってるんだけど、マップチップの設定を見るとこういう設定項目がある。

通行可能
× 通行不能
通行可能、かつ、後ろにいくとキャラクターが隠れるチップ(ただし「すり抜けON」のキャラは常にこのチップに隠れてしまいます)
通行可能、かつ、常にキャラクターの上に描画されるチップ
通行可能/不能を下のレイヤーに合わせます。下のレイヤーがない場合は通行可能です。
□(半分塗りつぶされている) そのチップに乗るとキャラの足下16ピクセルが半透明になります。


これに加えて、さっき出した四つの通行データを設定する「通行方向」と、このチップを挿んだ場所にいるキャラクターのイベント影響を受けるかどうかの「カウンター属性設定」と、色々スクリプト上からまさぐれる「タグ番号」ってのも設定可能。


またウディタは3レイヤー構成でマップを作るので、こういう色んな設定を施したチップを三層にちりばめて色々やるみたい。


なんかめっちゃ多いなぁと思うし、マップチップの設定するの大変そうと思うけど、実際にエディタでマップを描いてみるとこれがいかに合理的かがわかる。

自分でやる場合

マップエディタはまあマップだけ編集出来ればいいので、そこでやるかどうかはともかくとして、どこかしら実装はするだろうということでちょっと考えてみたんだけど、さすがにウディタのは複雑すぎるなぁと。
特に★とか▲とか□とかは、そんなんJavaScriptにやらせないでくれよというレベル。


なので、4方向での移動判定とかはやるとして、上部に描画するとかは普通に上部レイヤーに描いてくれよって話にすると思う。
また、通行設定はレイヤー単位で通行設定されるレイヤーか、そうでないレイヤーかを分けるべきだと思う。
チップごとに下レイヤーに影響を受けるチップかどうかってのは、ちょっと複雑すぎる印象。


ただそういうおおまかなところは想像出来ても、x1, y1からx2, y2に移動する際に例えば3チップ飛ばすような例があったとして、その移動をどういう風に処理すべきなのかが決まらないので、結局やってみないと最終決定は出来ないだろうな。
滑らかな移動をさせるためには結構微調整、微調整って世界になりそうだし。


HTML5でのRPGツクール的なツール作りたいけど、さすが参入業者の少ない分野だけあって考えること多いなぁと。
こういうの全部クリアしてRPGツクールやウディタは世に送り出されているわけで、すげぇと思うわ。


己の憧れに挑む、という意味で、機会があればRPGツクール的なツール一本作ってみたいもんだ。
概算で一ヶ月かければある程度のものは作れる、と思ってるんだけど、その時間捻出が難しい。

*1:今10代前半でウディタ触れてるボーズ共、そいつは20年前の俺が切望してやまなかったのにお金を積んでも決して手に入れることが出来なかったツールだ。大事に使えよ!