【プチコン4講座】複数レイヤーを持つマップを作ろう

プチコン4

プチコン マップレイヤー

こんにちは。継続の錬金術士なおキーヌです。

ブログ毎日更新は149日目になります。

前回「【プチコン4講座】RPG用のマップデータを作成しよう」でマップデータの作成を行って外部ファイル読み込みを行いました。

現状ではだだっ広い空間になってしまっていますがマップエディタがまだないので
自分でプチコンRPG講座と同じマップを作ってマップレイヤーを実現しましょう。

地面を作ったらそれと同じサイズの配列をコピーして障害物を置いていくような感じです。

それではプチコン4でRPG作り第2回目を始めましょう。

  1. マップデータをいじろう
  2. マップデータをレイヤー別に作ろう
  3. マップ描写処理を関数化しよう

マップデータをいじろう

前回作ったマップはだだっぴろい草原になってしまってたので、入り組んだ道にしてみましょう。

マップデータを作った時、0が道で1が木になっていましたね。

マップデータ配列を変更してみましょう。

もし前回のデータを保存しないままにしていたら、
一度下記のコードを打ったファイルをプロジェクトファイルとして保存しておくと作り直しやすくていいですよ。

DIM MAPDATA[] = [25,15,\
  1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,\
  1,0,1,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,\
  1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\
  1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,\
  1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,\
  1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,1,1,0,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,\
  1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,\
  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1\
]

SAVEV "DAT:MAP001",MAPDATA

このコードを

RUN 1

で実行してマップデータを保存してください。

そして、前回作ったコードでマップデータを読み込んでください。

プチコン4 出力結果その1

このようになっていたらOKです。

ver3では木のチップは別レイヤーに記述していましたが、プチコン4では同じレイヤーにしてみました。

一緒にした意味は特にないです。

マップデータをレイヤー別に作ろう

現在、マップデータは25x15のマップデータを表示するデータしかありません。

モンスターや宝箱などをおくにはこれだけでは足りません。

もしこのままモンスターや宝箱(以下イベント)を木があったところに置いてしまうと、イベントが消えた時本来通れないはずの場所が通れてしまうようになります。

こうなるとゲームとして破綻してしまうので、マップと同じ大きさの配列を作ります。

イベントがそこにいると判定するためのものなので、全て数値は0で大丈夫です。

25x15の大きさだけ確保しておけば問題ありません。

マップデータは以下のようにしたいと思います。

  • レイヤー0:マップチップを描写するためのレイヤー
  • レイヤー1:動かないイベント(宝箱など)をおくレイヤー
  • レイヤー2:動くイベント(モンスターなど)をおくレイヤー
  • レイヤー3:予備

レイヤー0はすでに作っているので、レイヤー1〜レイヤー3まで増やしましょう。

文字だけではよくわからないと思うのでコードを見てもらうとなんとなく意味がわかると思います。

DIM MAPDATA[] = [25,15,\
  1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,1,\
  1,0,1,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,\
  1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\
  1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,\
  1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,\
  1,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,1,1,0,1,\
  1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,\
  1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,\
  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,\
  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,\
\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\
]

SAVEV "DAT:MAP001",MAPDATA

1つ目のマップをコピーして、別のスロットに貼り付けて置換機能ですべて0にすると楽です。

そして、1つ目のマップの最後にカンマをつけて、わかりやすいように1つ改行をつけて同じサイズの数値配列を貼り付けましょう。

これで計4レイヤー分のデータができました。

保存してください。

基本的にTPUTで描写するのは0レイヤーのみです。

ループはマップデータの0個目と1個目の数値分しか回さないので気にしなくても大丈夫です。

マップ描写処理を関数化しよう

最後に、マップデータを表示している部分の処理を関数化してしまいましょう。

処理の関数化については【プチコン講座】関数!作らずにはいられないッ!を参照してください。

プチコンBIGの時に書いたことですが、プチコン4になっても関数の作り方の基本は変わらない部分です。

それでは前回作ったコードの一部を関数化しましょう。

ACLS

'--------------------------
' 変数・配列の定義
'--------------------------

' 変数宣言
VAR G_I = 0, G_J = 0, \
G_BGW = 0, G_BGH = 0
' 空配列宣言
DIM MAPDATA[]

'--------------------------
' プログラム初期化処理
'--------------------------

' マップデータファイル読み込み
MAPDATA = LOADV("DAT:MAP001")

' マップデータ配列の先頭2つを取り出す
G_BGW = SHIFT(MAPDATA)
G_BGH = SHIFT(MAPDATA)

' マップデータの描写
D_MAP_DRAW

'--------------------------
' 以下関数群
'--------------------------

' マップデータの描写関数
DEF D_MAP_DRAW
  ' マップチップ配列を描写
  FOR G_J = 0 TO G_BGH-1
    FOR G_I = 0 TO G_BGW-1
      ' ローカル変数CPに計算した値を入れる 
      VAR CP = G_I + ( G_J * G_BGW )
      ' CASE文でMAPDATA[CP]の内容に応じて処理を切り替える
      CASE MAPDATA[CP]
        ' 0のとき
        WHEN 0:
          ' 地面を表示
          TPUT 0, G_I, G_J, CHR(&HE8C9)
        ' 1のとき
        WHEN 1:
          ' 木を表示
          TPUT 0, G_I, G_J, CHR(&HE8CA)
      ENDCASE
    NEXT
  NEXT
END

DEF~ENDで挟まれたものは関数になります。

DEFの後についている名前は自由に決めることができますが、
私はわかりやすいように関数の名前の頭に「D_」とつけるようにしています。

もしつけていないとどこで定義したものかわかりづらくなるためです。

こういった変数や関数の名前は1発でなにかわかるようにしておいたほうがいいでしょう。

──プチコン4になってからなくなって不便になった部分もありますが、それ以上に今風の言語っぽいつくりになっているのでとても作りやすいです。

命令が結構変わっちゃったので記事は別に作り直していく感じです。

基本的な処理はプチコンには関係ないので、書いている記事はどのプログラミング言語でもある程度は同じ処理を使えると思います。

なのでプチコンBIGの講座をみながら自力でプチコン4に移植しようとすると、
プログラミング初心者の域を簡単に抜け出せると思います。

次回はゲームループを作ってスプライトを表示して操作できるところまでやりましょう。

それでは。