EXCEEDの同人ソフト開発日記という名の備忘録

趣味のゲームソフト開発人。プロなのかアマなのかは不明(不定)らしい。

任天堂のソフトはいつも予定通りに出てこないって言われるけど、
ソフト作りっていうのは、そういうもの。
ゲームソフトは、期限までにやれと言われて、徹夜したり死に物狂いでやったからといって、
期待通りのものにはならない。そういうふうにすると、
結局、チームは妥協しなければならなくなる。
妥協させられて、できたものは、粗くなってしまう。
ユーザーは目が肥えていますから、受け付けてもらえない

山内 薄

最後の技術的課題は「スプライト」

AMIGAは確かに超高性能なグラフィックス機能を搭載したパーソナルコンピューターではあったが、流石に1985年に発売されたハードであるため、2005年現在、その性能はどうしても見劣るものであり、現実問題としてハードウェア的には、最大で同時に8個しか表示できない。(しかし、サイズは 64x64 とかなり大型)そこで、アクロバットなテクニックを駆使して、最大表示数を増やすことしたいワケだが、有名な技法としては、HSync割り込みを利用して、現在表示中の水平ラインよりも上の位置にすでに表示されているスプライトを、まだ書き終えていない水平ライン以下の位置に再表示することで、最大表示枚数を増やすというテクニックがある(同テクニックを最大限に駆使したファミベのよっしん氏作の「超連射68K」はあまりに有名)ただし、この方法を使用しても、どうしても横方向には、ハードウェア上の最大同時枚数を超えて表示することはできない。たとえば、AMIGA の場合、8個を超える数を同一横方向に表示しようとしても、表示されない。(ファミコンの横方向に4個を超える 16x16 サイズのスプライトを表示できない理屈と同じ)

それで、幸いにも、海外で VSPRITES という大変すばらしいライブラリを作られた方がおり、そのライブラリを使用させてもらうことにしたのだが、ここでもう1つ問題があった。それは「プライオリティ」の問題で、残念ながら、この VSPRITES はスプライト間のプライオリティに対応していない。たとえば、スプライト同士が重なる場合、プライオリティは「Y座標が少ない方が手前に表示される」という風になってしまっている。そこで、VSync毎にスプライト用の自前のディスプレイリストを用意して、Y位置を基準としたソートを行って、プライオリティを再現しなくてはならないのだが、AMIGAのグラフィックアーキテクチャの関係上、一筋縄ではいかず、これをおいそれと実装するのは困難に思われた。結局そうしているうちに「光陰矢の如し」となってしまったのだが、幸いにも先日、ふと良いことを思いついた。

要するに、「Y座標の位置でプライオリティが決まる」ワケだから、スプライトの縦のサイズを8ドット分犠牲にして、スプライトパターンの真上に、1〜8ドットの厚さの透過色のラインを追加する。それで、描画要求関数にプライオリティの引数(0〜7)を用意して、それに応じた分だけ、キャラを上方向に表示し、表示パターンのオフセットをずらしてスプライト登録しておけば、見かけ上全く問題なく、プライオリティが再現できるはずである。

汎用性に欠ける方法ではあるが、私の想像している花札ゲームを制作するには問題がないと思われるので、採用したいと思う。