「SPACE HARRIER (c) SEGA」



◆疑似3Dゲーム

 スペースハリアーはセガの疑似3Dシューティグゲームです。体感ゲーム第2弾として発売されたこのゲームは、今までの3Dゲームとは段違いにゲーム性、音楽、グラフィックに優れていました。高速に拡大縮小される敵キャラはプログラマーにとって格好のネタとなりました。私も当然興味を持ちましたが、ゲームの方は1面のボスが全然倒せずに「つらないゲームや〜」と言って他人のプレイを傍観していました。
 このスペースハリアーは、セガのコンシューマーマシン「Super 32X」用として発売されています。10年前のゲームとは思えないほど優れものです。機会と機械があったらぜひ遊んでみてください。


◆座標変換の苦労

 このスペースハリアーは、見事MZ-700に移植できました。移植期間は半年。オリジナルモード(アーケード版と同じ)、X68000モード、FM-7モード、SEGA MarkIIIモード、タイル付きモードなど、つけるだけつけてあります(無謀ともいう)。
 このゲームは一応3Dゲームなので、どうしても「座標変換」を行う必要があります。つまり、遠くの物体になると特定の消失点に近づいていくわけです。が、この座標変換作るのに以外と時間がかかってしまいました。計算式自体は「X座標÷Z座標」(Z座標は遠くにいくほど大きくなる)という単純なものです。まず小数演算を消す必要があります。というのも、Z80というCPUは小数演算ができないため、小数を含む(小数になってしまう)演算は、全て整数演算にする必要があります。この小数から整数演算に変更する方法は簡単です。X座標とZ座標を256倍しておき、割り算を行います。割り算を行った後に256で再度割り算をしてやれば無事に演算が行えます。というのはタテマエで、実際ゲーム中でやってみると、本物のようにいかない! どうなるかというと、近くだと瞬速で敵が通りすぎ、それを過ぎると極度に遅くなるという状態(笑)。
 いろいろ思案したあげく実際に敵を動かしながら、本物と同じような動きに見えるようにするという事をやって、強引に解決させました。


◆拡大縮小処理

 このゲームは遠くにある物は小さく、近くにあるものは大きく表示するという「拡大縮小処理」を行っています。ハードウェアでこの機能がついていれば、なにも考えずにすむのですがMZ-700は、そのような機能はありませんのでプログラムで処理する事になります。が、困りました。というのも、そのような処理の方法を書いた本が見当たらなかったためです。実際、拡大縮小処理の方法を知ったのは移植した後でした(笑)。という事は、このMZ-700用スペースハリアーは「まともな拡大縮小処理をしていない」という事です。
 まずキャラクタを拡大、縮小どちらかの処理のみ行うようにします。拡大するよりも縮小した方が処理が速くなるので、こちらの処理を選びました。縮小処理を楽にするために「キャラクタの大きさ」を固定しました。つまり、この「大きさ」を固定する事によって処理の軽減をはかろうという事です。しかし、大きさを固定すると言ってもキャラクタのサイズが結構異なるので、大きいブロックとその半分のブロックにわけるようにしました。
 問題はどうやって縮小するか? 縮小させるには適当な1ライン分のデータを間引いて表示させてやればいいのですが、その間引き方がわからない(笑)。ちなみに「まともな方法」ではブレゼンハムアルゴリズムを用いて行います。つまりラインのアルゴリズムの応用です(詳しくはMZのアルゴリズムの所をみてください)。X座標(データ)が1進んだときにY座標(表示データ)が変化した時だけ表示してやればいいわけです。これが、まともな縮小処理です。
 まともな縮小処理をしていないMZ-700用スペースハリアーは、非常に手抜きな方法を使っています。間引くべき座標(カウンタ)をあらかじめテーブルで用意してあるだけです。が、このテーブルに、ちょっとした細工がしてあります。前に大きいキャラクタと小さいキャラクタの2種類があると書きましたが、この間引くテーブルデータは、大きいキャラクタでも小さいキャラクタでも、どちらでもうまく縮小表示できるようにしてあります。また、キャラクタの中心は常に表示させるようテーブルデータを設定してあります。というのも、普通のグラフィックが描けるマシンならば、どんどん縮小していっても、消えてなくなる可能性は低いのですが、MZ-700の40x25の画面では、縮小処理をするとキャラクタが、間引かれて実際はあるのに表示されない場合が十分考えられるからです。消えてしまっては遠くにある敵は近くにきて突如として現われることになります。これでは、まずいわけです。そういう事を防ぐためにプログラムで中心点を消さないように、データの方も中心には必ず点が存在するようにしてあるという寸法です。


◆V-RAM(実際の表示画面)

 このゲームでも例によってメモリ内部に仮想画面を用意しておき最後に一括転送を行っています。ここでも仮想画面とV-RAMに工夫をしてあります。まず、MZ-700は文字などを表示する「V-RAM」と、文字の色を変更する「ATB V-RAM」があります。ここでV-RAMにアミ模様を描いておき、ATB V-RAMだけを変更するようにします。この方法を使うことで

(1)速度が速くなる(今まではV-RAMとATB V-RAM両方に転送しなければならなかった。つまり倍速になります)。
(2)使える色数が増えたように見える。

(2)の使える色数が増えるというのはアミ模様(タイリング)にしておくことで8色と8色の組み合わせで36色まで使えるわけで、うまく使えば8色では難しい灰色のグラデーションなども実現できます。普通、8色で灰色にする場合は「白」と「黒」を使います。絵の具でも白と黒を混ぜれば灰色になりますから、誰でもわかると思います。が、実際には「紫」と「緑」を交互にタイリングしても灰色に見えます。論より証拠やってみると以下のようになります。


 これはカラーコードに置き換えてみるとよくわかります。MZ-700で使用できる8色のコードは以下のようになっています(8色しか使用できないマシンはどれも同じはずです)。

 ■黒色:0
 ■青色:1
 ■赤色:2
 ■紫色:3
 ■緑色:4
 ■水色:5
 ■黄色:6
 ■白色:7

灰色は「黒:0」「白:7」、これを合計すると0+7で「7」になります。先ほどの「紫:3」と「緑:4」も合計すると3+4で「7」になります。もうわかったと思います。そう合計して7になるカラーコードの色をタイリングすると「灰色」になるというわけです。つまり「青:1」と「黄:6」も、やってみると灰色になります。
 さらにカラーコードの差分が大きいほど明るい灰色になりますから、これを利用すれば奇麗に見えてしまう灰色のグラデーションの柱が描けるというわけです。カラーコードの差分というのは「白」と「黒」では7−0で「7」、「緑」と「紫」では4−3で「1」になります。つまり「白」と「黒」の方が「紫」と「緑」よりも明るい事になります。これは「色の吸収」が関係しています。


◆仮想画面の工夫

 今までは実画面と同じ大きさ(40x25)の仮想画面を用意しておき、まとめて転送していました。が、SPACE BLUSTERシリーズはMZ-700で表示されないV-RAMの部分を使用して表示されないのをいい事に「仮想画面」に使っていました。この方法だとCPUがV-RAMにアクセスした時「ウェイト」がかかって遅くなってしまいます(実はだいぶ後になって知った・・・)。スペースハリアーからはメモリに仮想画面を取ることにしたのでV-RAMアクセスによるウェイトが減った分かなり速くなりました。
 仮想画面の次の工夫は横のサイズを変更した事です。今までは40文字分でしたが、スペースハリアーからは横幅を64文字分に変更しました。この変更により「座標計算」「描画」等が楽になります。(2のn乗にすると楽になるのはマシン語を勉強した人はわかると思います)。
 一番いいのは横のサイズを256にする事です。さらに高速化することができます。ちなみにSYSTEM-7cでは、この256サイズになっています。スペースハリアーの時64文字分にしたのはメモリの都合です(キャラクタが入らなくなる)。


◆高速化・・・せずに低速化

 問題となる部分が解決するとトントン拍子で移植は進みました。他のマシンならば、ひたすら高速化するのですが、速度に余裕があったので前にも書いたX68000モードやタイルなどをつけたりしました。また、物体が遠くにあるのか近くにあるのか、わかりにくいという事で「影」もつけました。自分の撃った弾は障害物に当たると跳ね返って、どこかに飛んでいく処理などなど。背景も最初なかったのですが、近景、遠景と追加し2重スクロールするようにしました。
 こうやって、どんどん「低速化」していきました。おかげでサイズも42Kという膨大な量になってしまいました。こんな巨大なプログラムをよく載せたものだと思います。Oh! Xの編集部の方々に感謝、感謝です。


◆おわりに

 結構、思い出のある作品です。それにしても、よく移植できるなあと思う人がいるでしょう。でも実際のプログラムは「らしく」動くようにプログラムされているだけです。はっきりいってMZ-700だからできたのであって、X68000でやれと言われても私にはできません。X68000も所有していますが私向きではありません。手抜きができるMZ-700というマシンは私にあっていたのだと思います。またサウンドも単音だったので、音楽も駄目な私にとって都合がよかった(ついでに音痴だったりする^^;)。グラフィック画面がないので、全部キャラクタ(文字)の組み合わせというのも絵が下手な私にはラッキーでしたし(笑)。
 X68000を選べないまま時は流れMZ-700とその後購入したMacを使っていく事になりました。そしてMacとMacroMind Director (現在はMacromedia Director)を使用してゲームを作っています。また、MZの方もMZ-2500とMZ-2861というように変わっています。XシリーズとMZシリーズを使ってみると、やっぱりMZの方が練られているし私向きかな、と思います。ずっとMZを使っていこうと思ってもマシンの機械的寿命がやってきます。はてさて、この先どうしたものか・・・。