レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

やっと完成 アドベンチャーゲーム

2019年07月12日 | 自作ゲーム

以前にゲームボーイ向けにアドベンチャーゲームを作りを始めてからかなり時間がかかってしまいましたが、やっと完成させることができました。ゲーム制作に取り掛かったときは簡単に考えていましたが、実際に作り始めると思った以上に大変でした。
作成したゲームは前にもちょっと書きましたが、初期のパソコンアドベンチャーゲームにいくつも発売されていたミステリーハウス風のゲームです。ゲームの目的は、お宝が隠されているという家に侵入し幾つもの罠をかいくぐってお宝をゲットするというものです。

ゲームのダウンロードはこちらになります。

MysteriousHouse.gb

実機もしくはエミュレーターで遊べます。実機での動作はGB USB SMART CARD 64M for GB/GBC/GBAで確認しています。バンク切り替えを多用しているので、フラッシュカートリッジはMBC1に対応している必要があります。普通の製品ならたぶん問題ないでしょう。

遊び方ですが、ゲームを起動するとまずタイトル画面が表示されます。

ここでテンキーかゲームボーイのボタンを押すとゲーム開始です。

昔のミステリーハウス系のゲームはキーボードによるコマンド入力方式で、ゲームが受け付けてくれるコマンドや名詞を自分で探し出す楽しさ(難しさ?)がありました。今回作成したゲームはゲームボーイにつないだテンキーかゲーム機本体のコントローラーによる操作が前提なので、表示されるコマンドを選択するようになっています。



実際に見てもらえれば分かると思いますが、ゲームを開始すると画面右側にコマンドが表示されます。コマンドを選択すると、場面に応じてその対象となる物の名前が幾つか表示されますので、これを選択することでゲームが進んでいきます。コマンドの選択結果は画面下部に表示されるようになっています。
ゲームには移動モードとコマンド選択モードの2つのモードがあります。移動モードで場所の移動を行い、コマンド選択モードでその場所での動作を指示します。コマンド選択モードのときは、コマンドごとに割り振られている数字にカーソルが表示されます。



具体的な操作方法は以下のようになっています。

Arduinoで接続したテンキーを使う場合:
・移動モード
 8246…前後左右へ移動
・コマンド選択モード
 1〜6...コマンドや名詞の番号を選択 (場面によってコマンド等の数は変化する)
・モード切り替え
 リターンキー

ゲームボーイ本体のコントローラーを使う場合:
・移動モード
 方向キー
・コマンド選択モード
 方向キー上下でコマンドを選択してAボタンで決定
・モード切り替え
 Bボタン

移動は画面に対して前後左右となっていて、東西南北のように移動方向が固定されているわけではありません。それからゲーム自体それほどボリュームのあるものではないので、セーブ機能はついていません。
コマンド選択式なのでゲームが行き詰まるようなことはないと思いますが、むやみやたらにコマンドを実行するとゲームオーバーになってしまう意地悪な場面もあります。セーブ出来ないので、ゲームオーバーになったところはきちんとメモしておかないと、最初の玄関の場面を何度も繰り返すことになってイライラする羽目に陥ります。

ひと通り動作確認は行っていますが、もしかすると未発見の不具合はあるかもしれません。また、エミュレーターと違って実機の場合は画面表示にゴミが残ってしまうことがあります。ゲームの実行に支障はないのでそのまま放置しています。スミマセン。

ところでゲーム作成は本当に大変ですね。特に絵心のない者にとって、ゲームのコンテンツを作るのは至難の業です。今回は試行錯誤の上、Googleのこのサイトのイラストを主に利用させてもらいました。手書きの絵を元に、人工知能でそれと似たイラストを表示してくれるというとっても優れたサイトです。Googleさんありがとう。

意外に苦労したのが文字の表示部分のプログラムです。ケームボーイのビデオRAMは容量が限られているので、文字フォントをもたないゲームボーイでは、画像と文字両方同時にVRAMに収めるのが結構大変です。そのため画像はできるだけシンプルなイラストにして容量を浮かせ、文字は数字とひらがな限定にすることでなんとか納めることができました。しかし、問題は濁点等の扱いでした。
ゲームボーイのスプライトは1画面40個まで、1行当たり10個までという制約があるので、文字は背景画像として表示するしかないのですが、これは1画面20x18個のタイルマップとなっています。文字のVRAM使用量を減らすため濁点等はひらがなのフォントに含めずに独立して1文字として扱うことにしたのですが、これをタイルマップで表示するととっても見栄えが悪いのです。
そこで文字を表示する行を1行つぶして、濁点だけを表示する行とすることにしました。ゲームボーイではよく見かける手法です。
この方法だと確かに見栄えも改善され、視認性も高くなりました。が、まだちょっとバランスが悪い感じが残ります。濁点はかなとかなの間くらいに表示するのが一番キレイに見えるのですが、20x18のタイルにきっちり区切られているのでそれが出来ないのです。濁点のフォントを分割してみるとか、かなフォントを工夫して濁点がかなの間にあるように見せかけるという手もありますが、1文字8x8ドットで上手く表現するのはとっても大変です。

結局、最終的に選んだのは濁点をスプライトで表示するという方法です。スプライトなら1ドット単位で表示位置を決められますし、濁点(半濁点含めて)だけなら1行当たり10個までという制約にひっかかることもまずないでしょう。結果として表示はかなり自然になりました。しかし、プログラムは複雑になりかなりの時間をバク取りに費やすこととなってしまいました。

その他にも面倒だったのは、このゲームは沢山の画像を扱うのでZ80が直接扱えるROM領域には納まらないことです。そのため画像とプログラムを複数のROM(実際はフラッシュですが)に分散して収め、バンク切り替えでROMを切り替えながら実行させることで実現しました。バンク切り替え自体は難しくないのですが、ゲーム実行中に切り替えるのできちんと処理しないとプログラムが暴走してしまいます。
結構ややこしいですが最終的にうまく動作してくれると、ゲームボーイの機能をフル活用しているようでとても気分いいです。

しかし、アドベンチャーゲームを作るのはもうこりごりですね。次は久しぶりにArduinoを使ってゲームボーイに何か接続してみたいと思います。



最新の画像もっと見る

コメントを投稿