[GameMaker: Studio] 他の汎用ツールで出力したデータの取り込み

gms_mapdata_1

ステージ(マップ)を作成するときに、GM:Sを始めたばかりの方は各パーツを個別にobject化してroomエディタで配置しているかと思います。
この方法はちょっとしたミニゲームを作る際には視覚的にもわかりやすくていいのですが、効率面では非常に悪いものです。

特にギミックのない床や壁をそれぞれobject化するのは大変ですし、マップが複数ある場合にいちいちroomを作るのもただ面倒なだけです。

地形objectは一つにまとめ、マップはTiledのようなマップエディタで作成すると、結果的に作業量は大幅に減り、ゲーム自体の拡張性も高くなります。

マップエディタで作ったマップはこんな感じでimage_indexの番号でテキスト出力しておきます。この例では横10ブロックx縦4ブロックのデータになっています。

var d = '[11, 21, 21, 21, 21, 21, 21, 21, 21, 9, 11, 21, 21, 21, 4, 21, 25, 27, 21, 9, 11, 21, 21, 1, 46, 21, 21, 21, 21, 9, 41, 2, 2, 29, 31, 2, 2, 2, 2, 42]';

データを [ ] でくくっているのは、json_decode命令を使ってds_map/ds_list形式の配列に変換するためです。

var m = json_decode(d);

あとはステージの初期化時にこのデータを使って必要数分ループさせて、n = instance_create(dx, dy, obj); n.image_index = m[i];のようにで配置していくだけです。image_index以外にも色々と変えるならwithを使ってもいいでしょう。

データ文字列は { } も使って { “width”:10, “height”:4, “data”:[1,2,3] } のようなjson形式の文字列にしても大丈夫です。
この場合はds_map形式のデータとして各要素にアクセスできます。

データはソースに埋め込んでもいいですし、HTML5のように通信前提の環境であれば必要に応じてHTTPレスポンスで受信するなんてこともできます。

データを文字列で作るとデータ量が増えたり、いわゆる“ソースばれ”なんていうこともあるので、場合によっては何かしら加工もしておいた方がいいかもしれません。