古籏一浩氏の昔話【後篇】 ~ MZ-700版スペースハリアーの開発話
昔話:mz-700にスペースハリアーを移植する際に、このビデオを見ながら腕時計で時間を計って、ゲーム開始後(ステージ開始後)何秒後に、どの敵が出現するかを紙に書いていきました。本物の出現順と同じなのは、このビデオのおかげです。このビデオがなかったら大変でした。
2011-11-14 23:09:56昔話:ビデオを見ながら敵の出現秒数を書いていきましたが、実際には一度に全部やったわけではありません。ステージ1だけ書いた後、ステージ2〜12まで、その後13,14,という具合に仕事から帰ってきてから処理していました。
2011-11-14 23:11:31雑談:Super Soft Magazineの裏表紙。当時はmz-700/1200用パックマン、mz-700/1200用のギャラクシアンも発売されていた。 twitpic.com/7e6gex
2011-11-14 23:30:14昔話:mz-700版のスペースハリアーで最初に考えたのが、どうやって高速化するかということでした。XEVIOUSやSBFZのように見えないVRAMを仮想画面として使うと低速になります。そこで、メモリ内に仮想画面を用意し転送する事にしました。
2011-11-16 00:23:50昔話:仮想画面は実際の画面サイズの40×25とは違います。座標計算を少しでも高速化するために横幅が64文字になっています。こうすると2のn乗なので多少座標計算が速くなります。横幅を256文字にすれば計算自体が不要なのですが、それだとメモリを全部使い切ってしまいます。
2011-11-16 00:25:03昔話:仮想画面のサイズは実際の画面よりも大きくしておくことでメリットも生まれます。大きな利点としてはクリッピング処理が不要になるという事です。画面からはみ出す部分は表示しないようにクリッピング処理をしないといけません。
2011-11-16 00:27:32昔話:クリッピング処理の時間がなくなれば、より高速化できます。ゼビウスの時はアンドアジェネシスの出現時にクリッピング処理していますが、実際には内部でスクロールして少しずつ現れるようにしています。このためエリア9ではアンドアジェネシス出現時に森が消えるわけです。
2011-11-16 00:28:59昔話:SBZFではクリッピング処理はマシンパワーにものを言わせてました。表示する時、1文字ずつ画面内にあるかどうかを調べています。このため、表示するサイズが大きくなると処理速度が低下してしまいます。また、キャラクタが多くなっても速度が低下します。
2011-11-16 00:31:00昔話:仮想画面が十分に広く、なおかつはみ出した部分がその範囲内に収まればクリッピングの必要はなくなります。スペハリの場合は64文字の仮想画面に対して実画面は40文字。24文字も余裕があります。そこでキャラクタの最大サイズの横幅を11文字としました。
2011-11-16 00:43:30昔話:11文字あれば左右どちらにはみ出したとしてもクリッピング処理を行わずに済みます。また、縦幅は10文字または20文字分にしました。それで、この10文字、20文字というのが原因で、あるよろしくない事態が発生しました。
2011-11-16 00:46:29昔話:ハリアーの当たり判定は背中の腰の1文字分だけです。そして、地上物の高さは最大でも20文字。ということで、地上物は一番上にいると、まったく当たらずやられることがありません。このため9面や14面など天井が下がってくる面では上で、うろうろしていればクリアできます。
2011-11-16 00:48:07昔話:mz-700版のスペースハリアーで最初に作成したのは自分が操作するキャラ(ハリアー)を動かすことでした。最初は画面は真っ青(1面の空が青色なので)で、そこにハリアーが表示されカーソルキーで上下左右に動くというものでした。
2011-11-18 00:30:26昔話:ゲームを作る時には、いきなり細かいところまでしっかりプログラムするわけではありません。ゼビウスもハリアーも、とりあえず自分が操作するキャラを動かすところから始めます。基本的な部分だけ作って細かいところは最後に作成します。
2011-11-18 00:31:42昔話:ただし、肝心な部分に関しては最初に考えておいて最初の段階で高速化してしまいます。スペースハリアーの場合、もっとも重要なのは速度です。ですから、最初に高速化できるように仮想画面のサイズや転送処理を考えるわけです。
2011-11-18 00:32:53昔話:仮想画面は横幅が64で実際の画面幅の40文字より大きくなっています。単純に転送するなら同じサイズの方が有利です。特にZ80ではLDIRという命令がありHLレジスタで示すアドレスからDEレジスタが示すアドレスまでBCレジスタ分転送してくれます。
2011-11-18 00:36:08昔話:ところが、仮想画面の横幅と実画面の横幅が異なる場合、LDIRで一括転送できません。LDIRだと低速だというのもありますが、HLレジスタからDEレジスタが示すアドレスに内容を転送するLDIという命令と組み合わせることで高速に転送しています。
2011-11-18 00:36:18昔話:高速に転送するだけならば割り込みを禁止した後で、スタックポインタを設定しPUSHしていくという方法もあります。一応実験としてやってみましたが、ゲームの場合BGMや効果音の都合もあり割り込みを止めてしまうのはよくないと思い採用しませんでした。
2011-11-18 00:37:51昔話:mz-700版のスペースハリアーで自分が操作するキャラ(ハリアー)を動かすと猛烈な速度。これなら、いけるかなと思って次に作ったのが地面。地面はタイル状のものではなく、X68Kなどのスペハリと同じ横線だけのもの。横線の幅を変化させることで奥行きを表現します。
2011-11-20 00:37:29昔話:横線だけの地面の場合は単純に横に同じカラーコードで埋めるだけなので高速です。仮想画面に描いて、それを実画面に転送しても十分すぎるほど高速でした。mz-700なので描く部分が少ないのとゼビウスとは異なりカラー画面だけに転送すればよいからです。
2011-11-20 00:39:43昔話:ということで実際に地面を動くようにしたものを宮内さん(SBSGで住所見て手紙をくれた人)にカセットテープで送りました。すると、早速返事が返ってきました。どうも、地面が上に移動しすぎるといのご意見。確かに本物よりかなり上に地面が表示されています。早速修正しました。
2011-11-20 00:44:04昔話:修正したので宮内さんに送りました。今度はOK。こんな具合でmz-700版のスペースハリアーは宮内さんと何度かやりとりし実際に見てプレイしてもらって開発していきました。これまでは、一人で作成してきたので発表前に他の人の意見をもらえるのは貴重でした。
2011-11-20 00:50:29昔話:mz-700版スペースハリアー。何となくそれらしくハリアーが動き地面も上下するように。となると、次は敵や障害物の処理。とりあえず簡単な障害物の処理を行うことにしました。が、ここからが難関でした。まず、3Dの技術がないのでアスキーの3D入門本を購入。
2011-11-24 23:46:46昔話:アスキーの3D本は入門編と応用編だったか数冊に分かれていましたが入門編だけ購入。座標変換はいたって簡単でZ座標値で割ればOK。なんですが、Z80には除算命令もない上に浮動小数点演算機能もなし。除算自体に時間かかる上に浮動小数演算すれば速度低下の可能性大。
2011-11-24 23:49:42昔話:という事で結局、あらかじめ1/Zの値を計算しておいて、それを256倍とか適当にn倍したテーブルを作成しました。そのテーブルの値とX座標を乗算すればOKのはずでした。が、実際には値の取り方が難しく本物のように見えるように値は細かく調整しました。
2011-11-24 23:52:32