メガドライブ版ファンタジーゾーン | Arcade Cabinet

Arcade Cabinet

自作したゲームコントローラを紹介します

 

 メガドライブ版ファンタジーゾーンを見てみたい…

そんな思いから、SGDKを使って、約2年前からメガドライブにファンタジーゾーンを勝手移植していました。(本当の目的は、メガドライブで背景画像をスクロールさせることを学習するためでした。)当時、ラウンド3まで移植したのですが、行き当たりばったりのプログラミングだったのため、不具合だらけで継続できない状況になっていました。

 そこで、ダライアスのプログラミングでいろいろ学習できた事を生かして、構造を一から見直し、プログラミングをやり直すことにしました。

 今回こだわった点をいくつかまとめてみました。

 

<座標の管理>

 右強制スクロールの「ダライアス」と比較すると、「ファンタジーゾーン」は、左右に任意方向スクロールするゲームスタイルが特徴(上下方向にも画面1/5程度の幅で任意スクロールする)で、プログラム的にみると、その分多くの処理が必要になります。

 

 最初に悩んだのが、座標の計算方法です。各ラウンドの横幅は2048ドットで左右が繋がってループするような構成です。滑らかな動きや、微妙な移動速度を再現するためには固定小数点を使用しますが、SGDKで用意されている固定小数点は16ビットだと下位6ビットが小数部に設定されており、扱える範囲が最小数-512で、最大値で511.984375までです。この単位だと、オパオパのマップに対する座標を扱えません。

 そこで、下位5ビットを小数部とした、符号無しの固定小数点を独自に設定し使用することにしました。符号なしなので、0から2048.96875までの数字が扱え、右端の座標を超えると、自然と0に戻ってくるので、丁度良いです。扱える数字の最小単位は1/32で0.03125になり精度が落ちますが、レトロゲームのシューティングには十分と判断しました。

 

 基本手にはマップに対する座標で処理しますが、最終的に画面に表示するときに表示座標を計算します。

x = Player_PosX - Scroll_X

y = Player_PosY - Scroll_Y

 当たり判定は、マップに対する座標で計算すると、マップの右端と左端がの境界部の座標計算に修正が必要になります。例えば、x軸の0と2048の位置は同じ位置なので重なっていますが、計算上は重なっていないと判断されます。よって当たり判定は表示座標で計算した方が単純になります。

 

 ここまでは単純な計算ですが、スクロール面の背景画像の管理はやや複雑になります。

 

 スクロール面は画像が1枚絵になっている場合と、左右をまたいでいる場合があります。上図は、左右をまたいでいる状態のイメージです。512ドットを超えている場合は、左側に右半分の画像を描画します。

 プレイヤーはどちらの方向に移動するかわからないために、60分の1秒の1フレーム毎に隠れている右側の8ドット(1cell分)と左側の8ドットの座標と画像を計算しておき、右に移動すると決まった時点で右側を描画、左に移動すると決まった時点で左側を描画します。8ドット描画するということは1フレーム毎に最高8ドットスクロールできることになります。もし、16ドットの高速スクロールをしたければ16ドット(2cell分)描画すれば良いことになります。

(一気に全ての画像をVRAMに読み込み、表示したい箇所のスクロール値を設定して表示できるのであれば簡単ですが、メガドライブの VRAMにはそんな余裕はありません。ゲーム中に出現するキャラクタにたくさんの画像を表示したいため、スクロール面のサイズを512x256ドットを使用しています。)

 

<敵弾の方向計算の精度>

 ダライアスの場合、敵弾の発射方向は32方向分(360度を32分割した角度)ぐらいしかありませんでしたが、ファンタジーゾーンの場合、正確に自機を狙ってきます。おそらくその精度は128から256方向分ぐらいありそうです。そこで以前プログラミングしたレーダー法(自機への角度を求める方法)を改良し、128方向の精度で計算できる逆三角関数(arccos, arcsin)を作りました。

 

 こんな巨大なテーブルです。容量が大きくなりますが、今回はROMの容量の制約は考えずにプログラミングしています。1マスの大きさは8x8ドットです。

 

 こんな感じで、正確に自機を狙ってくるようになりました。

 

<パステルカラーとパレットアニメーション>

「ファンタジーゾーン」といえば、パステルカラーで描かれたポップで可愛らしい世界観が特徴です。メガドライブの最大の欠点は色数の少なさです。どう克服するか、1番の難題だったのかもしれません。16色のパレット(1色は透明のため実際に使える色はは15色)が4つしか使えないので、512色中64色以下です。32768色中2048色も使用できる「SYSTEM16A」に太刀打ちできるのか?

 

 「人間の目は隣り合わせの色の違いや色の組み合わせについては繊細に識別できますが、一つ一つの色の認識はかなりあいまい」という持論をもとに、試行錯誤を繰り返し、色を撰択しました。メガドライブの発色数でも実は大丈夫と最近は思えるようになってきました。ちなみにハイライト・シャドウ機能はうまく使えず使用しませんでした。

 スコアパネルやオパオパなどに1パレット、雑魚キャラに1パレット、前線基地に1パレット、背景に1パレットを使用しております。

 パステル調の世界観は再現できたでしょうか…。

 

<処理落ちとの戦い>

 CPU構成、処理スピードなどオリジナルのSYSTEM16Aと非常に似た仕様のメガドライブであれば、オリジナルと同じレベルでの移植ができそうです。今回SGDKが用意している関数を使用し、C言語のみでプログラミングしました。オリジナルのファンタジーゾーンがアセンブラで書かれているのか、C言語で書かれているのか、分かりませんが、自分はアセンブラは全く分からないので、C言語のみでプログラミングする必要がありました。

 

 

<各パラメータ>

 プログラムの構造が大きくなると、きちんとデーターを整理しないと、ごちゃごちゃになって、バグの原因になります。今回は各パラメータを、エクセルにまとめながらプログラミングしていきました。例えば雑魚キャラはこんな感じです。画面には鬱いいていませんが、右側にもっと多くのパラメータ(移動速度や、ショットを打つタイミングなど)があります。