ブログタイトル_RPGマップ

以前[いぜん]、マップエディタを使ったRPGのマップ作りについて書きましたが
今回は、ゲームでよくつかわれる
「マップチップ」をもとに マップチップをプログラムで[なら]べて、
[]きなマップを生成[せいせい]する方法[ほうほう]紹介[しょうかい]します。


関連記事
RPGのマップを作ろう
スクラッチでRPGのマップを歩き回ろう!


ScratchプログラムでRPGのマップを生成したい

まずはマップチップを準備する

マップチップというのは、マップを構成[こうせい]する1マスあたりの画像[がぞう]のことです。
17
こういうお[しろ]とか、草原の画像[がぞう]です。

これを[]きなだけ用意します。
今回は、草原・海・森・山・お[うち]・お[しろ]など主要[しゅよう]なマップチップを 17種類[しゅるい]用意しました。
map
今回このサンプルを使って説明[せつめい]していくので
必要[ひつよう]なかたはこの画像[がぞう]をダウンロードしておいてください。


こういう素材[そざい]は、公開している方がたくさんいるので[さが]しやすいと思います。

素材サイト:ぴぽや
素材サイト:ねくらマップチップ
その他リンク集

素材[そざい]のほとんどはpngやbmpなどの画像[がぞう]形式で
たくさんのマップチップが一つの画像[がぞう]にまとめられていますので
画像[がぞう]分割[ぶんかつ]ソフトなどを使って分割[ぶんかつ]したあと、Scratchにとりこみます。

分割ソフトはPL_ImageConstructorとかがおススメです。

以前「RPGのキャラをプロジェクトに追加しよう」という記事で
ImageSplitterというwebサービスをつかって画像を分割する方法を紹介しています。


今回は、拡大[かくだい]縮小[しゅくしょう]してもキレイになるように
ぴぽやのマップチップをもとに、ベクター画像[がぞう]で作りました。

https://scratch.mit.edu/projects/108698843/



マップデータを作る

マップデータは、何でもいいのですが今回は「CSVデータ」というものを使ってみましょう。
CSVとは「コンマセパレートバリュー」の[りゃく]で、コンマ(,)で区切られたデータのことです。

たとえば
1このマップチップを「1」
2このマップチップを「2」
というように、マップチップに数字をわりあてておき

1,1,1,1,1
1,2,2,2,1
1,2,2,2,1

というデータをもとにマップを作ると
map_sample

このようなマップになるのです。イメージができましたか?

さて、自分でポチポチ数字を打っていくのでも[]いのですが
せっかくなのでなにかツールを使ってみましょう。

フリーソフト「マップエディターQuoyle」というソフトはpng画像[がぞう][あつか]え、
マップチップを[なら]べるエディタ機能[きのう]と、テキストデータの書き出し機能[きのう]があります。

ダウンロードして、zipファイルを[]きな場所に展開[てんかい]しましょう。
中に「Quoyle.exe」がありますのでこれを起動します。

WS0283

最初[さいしょ]は、よくわからないウィンドウがでて戸惑[とまど]うかもしれませんが
順番[じゅんばん]設定[せってい]していきましょう。

まずは「マップデータ設定[せってい]」のアイコンをクリックしてみましょう。

WS0286


こんな画面が開きます。
今回は、マップチップのサイズが32*32なので
「マップサイズX:15 Y:12」
「チップサイズX:32 Y:32」 に設定[せってい]します。

次にマップチップの画像[がぞう]パスを設定[せってい]します。「参照[さんしょう]」ボタンをクリックして
WS0284
先ほどダウンロードしておいたmap.png画像[がぞう]をえらびます。
ここで、自分で用意した画像[がぞう]を使いたい時はそのマップチップの画像[がぞう][えら]んで下さい。

本体設定[せってい]はとくにいじらなくてもいいですが ウィンドウのサイズなどを決められます。
また、初期化[しょきか]用チップの設定[せってい]確認[かくにん]しておきましょう。
WS0288
マップチップの一番左上のマスが空欄[くうらん]になっていますので
これを初期化[しょきか]用チップに設定[せってい]します。0番にしておきます。


設定[せってい]ができたらマップを作ってみましょう。
WS0289
[]りつぶしモードをえらんで、パレットから草原をクリックします。
配置[はいち]ウィンドウをクリックすると、全体が草原になりました。


WS0290
つぎに、ペンモードを「ノーマル」にもどして
パレットから水のチップをえらび、海や川にしたい部分をぬっていきましょう。
これで、ベースの地面の部分ができました。


つぎは、木や山などのオブジェクトを[]いていきましょう。
WS0291
オブジェクトは、地面の上に[]きたいので、レイヤーを分けましょう。
レイヤーの「追加[ついか]」ボタンを[]すと、レイヤーリストに「layer-2」というレイヤーがふえます。
これをクリックして[えら]ぶと、マップのうえにオブジェクトを重ねることができます。



WS0294
こんなかんじになりました。
オブジェクトのフチが白くなっていますが
Scratch上で配置[はいち]するときにはなくなりますので、気にしなくても大丈夫[だいじょうぶ]です。



マップデータができたら、いったん保存[ほぞん]しましょう。
WS0292
ファイルから「名前を付けて保存」をえらんで・・・


WS0293
名前はなんでもOKです。拡張子[かくちょうし]が自動でつかないので、○○.qmpのように拡張子[かくちょうし]つきで保存[ほぞん]
今回は「scratch_world.qmp」としました。

保存[ほぞん]したら、このソフトを終了[しゅうりょう]させましょう。



テキストデータかきだし、よみこみ

作ったマップデータを、テキストデータにコンバート(変換[へんかん])しましょう。

WS0295
Quoyleと同じフォルダのなかに「Converter.exe」というファイルがありますので
これをクリックして起動します。

WS0296
先ほど作ったマップデータ「○○.qmp」ファイルをこの画面にドラッグ&ドロップするか
「QMPファイルを開く」から、開きます。

保存[ほぞん]先は、デフォルトがQuoyleのフォルダになっています。
保存[ほぞん]先を[]えたい時は、「保存[ほぞん]先」ボタンからえらびます。

変換[へんかん]形式を「txt形式」にします。

さいごに「コンバート開始」のボタンをおすと、変換[へんかん]してくれます。

WS0297
変換[へんかん]がおわったら、できたファイルを開いてみましょう。
qmpファイルと同じ名前.txtで保存されています。

WS0298
テキストの中身はこんなかんじです。
このままだと、文字データも入っているので
マップデータのみにしていきましょう。

WS0299
まず、レイヤー1のデータ部分だけを選択[せんたく]
右クリック→「コピー」します。(Ctrl+CでもOK)


WS0301

コピーしたら、「ファイル」→「新規[しんき]」をえらんで


WS0302
「右クリック」→「[][]け」(Ctrl+VでもOK)
で、コピーしたデータをはりつけます。

はりつけたら、「ファイル」→「名前を付けて保存」で保存しましょう。
ファイル名は何でもいいですが
地面のデータだとわかるようにしましょう。
今回は「map.txt」としました。

同じ要領[ようりょう]で、今度は、レイヤー2のデータも
あたらしいファイルにコピーして保存しましょう。
こちらはオブジェクトのデータですので「obj.txt」としました。

データができたら、Scratchにデータを[][]んでみましょう。
まず、データを保存[ほぞん]しておくリストを用意します。
WS0303
今回は、マップとオブジェを別々[べつべつ]に作ったのでふたつ用意しました。
[][]みたいリストにチェックをいれて
ステージに表示[ひょうじ]させておきましょう。


WS0305
ステージに表示[ひょうじ]させた「マップデータ」のリストを右クリックし
[][]み」というメニューをクリックします。

WS0306
先ほど作った「map.txt」をえらびます。

WS0307
こんなかんじで[][]まれます。
12行目の最後[さいご]のコンマがないので、ここで追加[ついか]しておきます。
(map.txtのほうで最後[さいご]のコンマを入れると、[][]みのときにカラム指定モードになってしまうので
こうしてます。プログラムのほうで例外[れいがい]処理[しょり]を入れてもいいかと思います。)



マップデータを追加[ついか]したいとき(2枚目[まいめ]以降[いこう]のマップをリストに追加[ついか]したいとき)は
map.txtのほうにマップデータを追加[ついか]して、 再度[さいど]Scratch上で[][]みという処理[しょり]になります。
(前のリストに追加[ついか][][]みはできない)

オブジェのほうも同じように、[][]みをしましょう。



マップ生成プログラム

データができたら、いよいよマップを配置していきましょう。

こちらのプロジェクトから
スクリプトの中身をみてみましょう。
https://scratch.mit.edu/projects/108698843/#editor


描画[びょうが]順番[じゅんばん]は、マップ→オブジェクトです。
マップのスクリプトがこんなかんじ
WS0308
定義[ていぎ]ブロックをつかっています。
変数[へんすう]「i」がタテ方向のループを担当[たんとう]
変数[へんすう]「j」がヨコ方向のループを担当[たんとう]しています。


コンマがくるまでは変数「コスチューム」のなかにデータをためていき
コンマがきたら、コスチュームをかえてスタンプしています。


この定義[ていぎ]ブロックは、オプションの 「画面を再描画[さいびょうが]せずに実行する」にチェックを入れておきます。
WS0309
こうすると定義[ていぎ]ブロックの処理[しょり]が終わるまでは再描画[さいびょうが]されないので
マップの描画[びょうが]一瞬[いっしゅん]で終わります。


オブジェの描画[びょうが]も、マップとほとんど同じです。
WS0310

オブジェの場合は、スタンプしない部分(データが0のところ)があるので
「0じゃなければスタンプ」のようにしています。

さらに例外[れいがい]処理[しょり]として、コスチュームがお[しろ]だった場合
(これはスタンプする素材[そざい]がベクターなのでできることですが)
ちょっと大きくしてスタンプしています。
[とう]も大きくしてもいいかもしれませんね。

マップ→オブジェの順番[じゅんばん]描画[びょうが]できるように
「0秒まつ」でオブジェのほうの描画[びょうが]を少し[おく]らせています。

これで[はた][]して実行してみましょう。
WS0312
キレイに表示することができました。

表示[ひょうじ]がずれてしまうときは、データの12行目の最後[さいご]にコンマが入っているか
ループの回数がおかしくないか、列と行をまちがえていないか
など確認してみて下さい。

まとめ

今回は、CSVデータを作る→読んでいく方法[ほうほう]紹介[しょうかい]しましたが

マップ画像[がぞう]をステージ分用意するのと
マップチップをデータ通りに[なら]べていくのと、どちらの方法[ほうほう]がいいかは
そのゲーム次第[しだい]です。

マップが少なければ、大きい画像[がぞう][まい]表示[ひょうじ]する方がいいでしょうし
たとえば主人公が動くのにあわせてマップが動くようなゲームの時は
マップチップのほうが描画[びょうが]しやすいですね。


自分が作りたいゲームにあわせて工夫してみて下さいね。