プロデルでレトロRPGを作る

プロデルでレトロなロールプレイングゲームを作ってみようと思います。
見下ろし型で、勇者が矢印キーで上下左右に動き、敵やアイテムを見つけながらゴールを目指すとてもシンプルなものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101225/38fdec30-7428-c9dc-1fd8-8298a9cf917a.png)

## マップゲームを作るには
マップゲームを作るには次のことをプログラミングします。

- マップデータの作成
- マップの描画
- キャラの表示と移動
- キャラ位置に応じたイベントの処理

以上の点を実装しておければ、ゲーム内容が複雑になったとしても、簡単な修正で事足りるかと思います。

## マップデータの作成

マップデータは、CSVファイルで作成します。
画面に表示するマップを10×10マスの各ブロックに分けて記号で表し、地図を書いていきます。
CSVファイルは、メモ帳などのテキストエディタで作るか、Excelなどの表計算ソフトを使って作ると簡単かと思います。
ファイル名は、map.csvとしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101225/f0bbe056-2ec1-a273-e398-40f07e1537bb.png)

※なおExcelでCSVファイルを開くと、CSVファイルに排他ロックが掛かるため、プログラムを実行する前にExcelを閉じる必要があります

###マップデータの記号の意味を決める
マップデータの記号には次のような意味を持たせます。記号は、自由に増やすこともできます。

| 記号 | 意味 |
|:-:|:-:|
| S  | スタート  |
| G  | ゴール  |
| x  |  壁 |
| M1  | 敵1  |
| M2  | 敵2  |
| M3  | 敵3  |
| I1  | アイテム1  |
| I2  | アイテム2  |
| (空白)  | 床  |

### 画像の用意
各ブロックに対応する画像の素材を用意します。
絵心があったりフリー素材が見つけたりした場合は、画像を画像図形として描くことにすれば、それらしいマップが作れるかと思います。
今回は、「パターン刷毛」を画像の代用に使ってマップを描くことにします。また勇者(プレーヤー)は、青色で表すことにします。

画像を使う場合には、ブロックに「刷毛」設定項目を設定する代わりに「画像」設定項目を変えてください。

## ロジックを考える

### マップの描画
マップの描画には、「キャンバス」部品を使い、それぞれのブロックをそれぞれ「画像図形」種類のオブジェクトとして作り、左上から順番に配置していきます。

CSVファイルとして作成した地図は、「マップ」配列に記憶しておきます。
特定の座標(横,縦)の記号を調べるには、```マップ(縦,横)```と書きます。
マップは、2次元配列のため、x,yではなく(y,x)の形式で指定する必要があります。
マップ配列の内容を順番に取り出して記号に応じた図形を描いていきます。

### キャラの表示と移動
勇者は、キーボードの矢印キーを使って、動かせるようにします。
また、勇者の情報を保持するために「キャラ」種類を定義します。このオブジェクトに座標(縦,横)やHPなどの情報を記録しておきます。

プレーヤーの現在位置は、「キャラ」種類の「縦」「横」変数に記憶します。
キーボードのキーが押された時には、「キャンバス1のキーが押された時の手順」が実行されますので、押されたキーに応じて、キャラの「縦」「横」の値を増減して移動します。

移動する時には、壁をすり抜けないように、移動先のブロックの記号が壁(x)でないかどうかを確認してから移動します。

```
キャラとは
	+HP
	+横
	+縦
終わり
```


### キャラ位置に応じたイベントの処理
勇者が移動した先に、敵やアイテムがあるかどうか、ゴールかどうかなどのチェックをするために「イベント確認する」手順を定義しておきます。
この手順では、キャラの位置の記号を調べ、その記号に応じたメッセージやHPの増減を処理するためのプログラムを書いていきます。

## 完成したプログラム

完成したプログラムは、次の通りです。
画面には、マップの他、メッセージを表示させるラベルや、HPを表示させるステータスラベルを描いておきます。

```RPG.rdr
データ表を作ってマップ表とする
マップ表へ「map.csv」から読み込む
マップは、マップ表の一覧

床刷毛というパターンブラシを作る
床刷毛の色は、緑
床刷毛の背景色は、黄緑
床刷毛のパターンは、芝生

壁刷毛というパターンブラシを作る
壁刷毛の色は、赤
壁刷毛の背景色は、茶
壁刷毛のパターンは、レンガ

キャラ刷毛という塗りつぶしブラシを作る
キャラ刷毛の色は、青

勇者というキャラを作る
勇者の横は、2
勇者の縦は、2
勇者のHPは、100

メイン画面を表示する
待機する

メイン画面とは
	ウィンドウを継承する
	+ブロック一覧
	はじめの手順
		初期化する
		ーー貼り付けた部品に対する操作をここに書きます
		キャンバス1へ文字を描いてステータスラベルとする
			その位置は、｛400,50｝
			そのフォントを「メイリオ」に変える
			その文字色を緑色に変える
			その文字サイズを20に変える
		キャンバス1へ文字を描いてメッセージラベルとする
			その位置と大きさは、｛350,120,200,100｝
			その大きさ調整を×に変える
			そのフォントを「メイリオ」に変える
			その文字色を緑色に変える
			その文字サイズを12に変える
		横を1から10まで増やしながら繰り返す
			縦を1から10まで増やしながら繰り返す
				キャンバス1へ画像を描いてブロック一覧(縦,横)とする
				その位置と大きさを{(横-1)*30,(縦-1)*30,31,31}に変える
			繰り返し終わり
		繰り返し終わり
		反映する
		イベント確認する
	終わり
	初期化する手順
	ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
		この実質大きさを｛848,477｝に変える
		この内容を「ロールプレイングゲーム」に変える
		初期化開始する
		キャンバス1というキャンバスを作る
			その位置と大きさを｛0,0,848,477｝に変える
			そのドッキング方向を「全体」に変える
		初期化終了する
		この設計スケール比率を｛144,144｝に変える
	終わり
	反映する手順
		横を1から10まで増やしながら繰り返す
			縦を1から10まで増やしながら繰り返す
				記号は、マップ(縦,横)
				【ブロック】=ブロック一覧(縦,横)
				もし記号が「x」なら
					ブロックの刷毛を壁刷毛に変える
				そうでなければ
					ブロックの刷毛を床刷毛に変える
				もし終わり
				もし横が勇者の横かつ縦が勇者の縦なら
					ブロックの刷毛をキャラ刷毛に変える
					ブロックの背景色を青に変える
				もし終わり
			繰り返し終わり
		繰り返し終わり
		キャンバス1を更新する
	終わり
	イベント確認する手順
		記号は、マップ(勇者の縦,勇者の横)
		記号について分岐
		「S」の場合
			メッセージラベルの内容を「冒険がはじまる」に変えろ
		「M1」の場合
			勇者のHPを10だけ減らす
			メッセージラベルの内容を「モンスターが現れた！10のダメージ。」に変えろ
		「M2」の場合
			メッセージラベルの内容を「コウモリが現れた！おどろいた。」に変えろ
		「M3」の場合
			勇者のHPを50だけ減らす
			メッセージラベルの内容を「モンスターが現れた！50のダメージ。」に変えろ
		「G」の場合
			メッセージラベルの内容を「出口に到着！」に変えろ
		「I1」の場合
			マップ(勇者の縦,勇者の横)は、「」
			メッセージラベルの内容を「魔法の薬を発見。」に変えろ
		「I2」の場合
			勇者のHPを20だけ増やす
			マップ(勇者の縦,勇者の横)は、「」
			メッセージラベルの内容を「非常食を発見！20回復。」に変えろ
		他の場合
			メッセージラベルの内容を「」に変えろ
		分岐終わり
		ステータスラベルの内容を「HP:[勇者のHP]」に変えろ
	終わり
	キャンバス1のキーが押された時の手順
		【次横】=0
		【次縦】=0
		この時のキー名について分岐
		「←」の場合
			次横は、-1
		「↑」の場合
			次縦は、-1
		「→」の場合
			次横は、1
		「↓」の場合
			次縦は、1
		分岐終わり
		次記号は、マップ(勇者の縦+次縦,勇者の横+次横)
		もし次記号が「x」でなければ
			勇者の横は、勇者の横+次横
			勇者の縦は、勇者の縦+次縦
			イベント確認する
		もし終わり
		反映する
	終わり
終わり

キャラとは
	+HP
	+横
	+縦
終わり

```

## まとめ
駆け足とはなりましたが、プロデルでレトロRPGを作ってみました。
ゲームと呼ぶには未完成な所がありますが、140行ほどでちょっとしたマップゲームを作ることができました。このプログラムを元にさらにゲームらしく改良してもらえたら嬉しいです。

## 参考ページ
https://produ.irelang.jp/blog/2020/03/1762/

https://produ.irelang.jp/blog/2021/05/2788/