MCL(67)

インデックスに戻る

前のMCLへ  次のMCLへ

▼ My Computer Life (67)

67. 地獄のエイリアン伝説2

 大体96年の末くらいだと思ったが、ポッカリ時間が出来てしまったので、以前作り損ねた「地獄のエイリアン伝説」をまた作る事にした。
 そもそも前回挫折したのは、途中でマウスが壊れたからだった。そしてまた、今回もマウスが壊れたままなのだが、もう最初から壊れているので、マウス無しで絵が描けるチップエディタ、マップエディタを作ればいいのだ。
 そういう意気込みで開発が始まったが、今回今までと大きく違うところは、最初からC言語で書く事を決めていた、という事だ。そもそもコンパイラもあって、また各種ツールも揃ってきていたのだから、もうBASICからの移植とかしなくてもいいだろう、と判断したわけだ。

 それにあたって、C言語での勉強もしておかないとなー、と考えた。
 そこで役に立ったのが、電脳倶楽部に載っていたあるゲームである。これは非常に、とても、素晴らしく役に立った。
 そのゲームは、「INTEGRAL ARM」という名前の縦シューティングゲームで、ゲーム自体も回転可能な腕を回したり固定したりしながら弾を撃つという内容で、なかなか面白い。が、重要なのはゲーム性ではなく、このゲームにはおまけでC言語のソースが一式ついてきた事だ。
 この事にだいぶ後で気づき、「これはいい勉強になる」と思ってチマチマ解析していたのだが、この地獄のエイリアン伝説2の開発のために、更に詳しく調べる事にした。関数一覧を書き出し、プリントアウトして、一つ一つの動作を追跡していった。
(ただ、このゲームは正式名称が「INTEGRAL ARM」なのだが、開発コードというか、プログラムの名称が「SHOOT2」だったので、私は心の中でずっと「SHOOT2」と呼んでいた。というか正式名称途中まで知らなかった)

 この経験は非常に役に立った。C言語の言語仕様が分かっただけでなく、BASIC的ではないC言語的な記述法も分かってきたし、今まで知らなかったようなX68k上の細かいテクニックも知る事ができた。例えば、このINTEGRAL ARMでは、テキストVRAMをほぼ使わないので、その512kバイトのエリアをワークとして使うためのルーチンを作ってそれを使っていたり、あるいはスプライトの定義等にも工夫を加え、それまで私の知らなかったような数々の手法を使用していた。この作者自身が色々プログラム技術の開発のために作っていたフシがあり、例えば敵に多関節系の奴が結構いて、線形リストを用いて再帰的に処理していたり、自前で画像回転を実装していたり、良く工夫されている。
 また、Makefileの書き方も分かったし、メインルーチンを短くし、そこのコンパイルオプションにだけ-fno-defer-popをつけるなど(スーパーバイザとの行き来の際のスタック補正の問題を解決する)、定番の情報も手に入れられた。
 このようなゲームのソースが公開されており、研究できたのは、とてもためになった。

 さて、地獄のエイリアン伝説であるから、もちろんRPGである。今回は、ロマンシングSAGAのように、少し大きめのスプライトを使っている。16x16のスプライトを4つ使い、32x32で構成している。なんかその方が現代的だと感じたからだ。
 また、今回は本格的に、透過パレットを使用している。#0057で少し書いたが、今回も前作と同様、背景はグラフィック画面、キャラクタはスプライトというやり方を踏襲している。ここで問題になるのが、「キャラが建物の後ろに隠れる」などというケースの表現だ。
 X68kは、テキスト・スプライト&BG・グラフィックの間で表示順序を入れ替えられる。しかし、複数あるグラフィック面のあいだにスプライトを挟み込む、などという事は出来ない。従って、スプライトが何かに隠れるというのをグラフィック面で行う事は不可能である。
 一つの解法として、BGを使う事が考えられる。キャラクタを表示するスプライトより手前に来る物は全てBG面を使って表現すれば、実現は可能である。しかし問題もある。BG面はスプライト同様キャラクタ定義を必要とするので、表現できる種類に制限があるのと、そもそもスプライト同様16色までしか表示できないので、最大65536色まで使えるグラフィック面より表示性能が劣ってしまう。
 このうち、後者に関しては、解決の方法がある。それが、透過パレットである(透過パレットという名前は、今私がつけた)。
 一般的にスプライトやBGは、16色使えるうちの1色が透明色となっており、後ろにある物が透けて見える。これ自体はごく普通の機能だが、これに加えてカラーコードを全て0000に書き換える事により、「後ろにあるスプライトも全て透明化する」特殊なパレットになる。従って、その透過パレットが設定してあるスプライトのドットは、後ろにあるスプライト全部を貫通して、背景になっている画面の色が表示される。
 半ば隠し機能であるが、これを使うと、今問題になっている、建物に隠れるスプライトというものを実現できる。建物のグラフィックの上に、隠したい部分と同じ形で、透過パレットで定義されているBGを重ねておけばいいのだ。
 今回の地獄のエイリアン伝説2は、その機能を使って陰面消去を行っている。

 他、今回作って困ったのは、その32x32の大型スプライトだ。
 マップチップは16x16で構成されているので、マップチップ4マス分という事になる。しかし、かっちり4マスにおさまるように配置すると、気持ち悪い事になる。そこで、見た目は32x32だが、当たり判定は16x16にして、マップ上は16x16を基準にする事にした。
 しかしこうなると、他のキャラと隣接した時や、建物にくっついた時に、めりこむ部分が出てかっこ悪い。
 なので、当たり判定側で工夫したり、そもそもドット絵の方を24x32におさまるようにスリムにしたり、色々工夫した。これらもやってみないとわからないもんだねえ…。

 まあそんな具合で、最初のDRAGONAUT同様、年末にかけてバーッと作ったが、そこで制作終了した。DRAGONAUT、初代地獄のエイリアン伝説と同じくらいの完成度での終了だ。人が、マップの上を動いて、みたいな。なんかそこまで来ると挫折するみたい。
 今回のは、引越しとか色々あって、なかなか続行できなくなったんだけどね。

 いつかはドラクエみたいなRPGを完成させたいなー。


前のMCLへ  次のMCLへ

戻る

TOM 2012