第1版第10刷
5章 スプライト
スプライトとは、8×8または16×16ドットの大きさを持つキャラクタパターンを画面上の任意の座標に表示する機能です。この機能を用いることににより、たとえばゲームのキャラクタの表示を簡単に行うことができます。
表示する時に指定するパラメータは、X座標、Y座標、キャラクタ番号、カラーコードの4つで、このデータをあらかじめ設定したスプライトアトリビュート・テーブルに書き込むことによってスプライトは表示されます。
MSX2のスプライトには2種類のモードがあります。1つは従来のTMS9918互換モードであり、これをスプライトモード1といいます。もう1つは新しい追加された高機能なスプライトモードで、こちらをスプライトモード2といいます。以下、スプライト機能の概要をまとめた後、この両者を順に説明していきます。
5.1 スプライトの機能
1つの画面には、最高で32個のスプライトを表示することができます。
スプライトの大きさは8×8ドット、または16×16ドットの2種類あり、2つを同時に指定することはできません。また、一般にスプライトの1ドットの大きさは、グラフィックの1ドットと同じですが、GRAPHIC5および6モード(両者とも512×212ドットの分解能)の場合には、横方向の大きさがグラフィックの2ドット分になります(結局、どのモードでも表示されるスプライトの絶対的な大きさは変わらない)。
その他のスプライトの機能に関しては、スプライトモードが1と2のどちらであるかによって変わってきます。スプライトのモードは、設定されている画面モードによって次のように自動的に選択されます。
スプライトモード1 …… GRAPHIC 1 (SCREEN 1) が選択される GRAPHIC 2 (SCREEN 2) MULTI COLOR (SCREEN 3) スプライトモード2 …… GRAPHIC 3 (SCREEN 4) が選択される GRAPHIC 4 (SCREEN 5) GRAPHIC 5 (SCREEN 6) GRAPHIC 6 (SCREEN 7) GRAPHIC 7 (SCREEN 8)
5.2 スプライトモード1
スプライトモード1はMSX1のスプライトと同機能です。したがって、このモードを使っている限りはMSX1でも動作可能です。
5.2.1 最大表示数
32個のスプライトには、それぞれ0〜31の番号が付けられていて、番号の若い方から高い優先順位が与えられています。画面の同一水平ライン上にスプライトが並んだ場合、優先度の高い順に4つまで表示され、5番目以降のスプライトの重なった部分は表示されません。
図4.57 スプライトの最大表示数(スプライトモード1)
5.2.2 スプライト表示のための諸設定
スプライトを表示するために必要な諸設定を以下に示します。
●スプライトのサイズの設定
8×8ドットまたは16×16ドットのどちらかを設定します(図4.58)。デフォルト(省略値)は8×8ドットになっています。
図4.58 スプライトのサイズの設定
●スプライトの拡大
スプライトの1ドットを画面の1ドットに対応させるか、または縦横2倍に拡大するかを設定します(図4.59)。デフォルトは1対1の対応になっています。
図4.59 スプライトの拡大
●スプライトパターン・ジェネレータテーブルの設定
VRAM上のスプライトパターン・ジェネレータテーブルにスプライトのパターンを定義します。スプライトパターンは、8×8ドットの時256個、16×16の時64個まで定義可能です。各パターンには0〜255のパターン番号が与えられ、図4.60のようにVRAMに配置されます。16×16ドットの場合は、テーブルの先頭から8×8サイズのパターンが4つずつ使われます。この時4つのパターンのどの番号を用いても、同じスプライトが指定されます。スプライトパターン・ジェネレータテーブルにアドレスを設定するためには、図4.60のようにR#6を使用します。
図4.60 スプライトパターン・ジェネレータテーブルの構造(スプライトモード1)
●スプライトアトリビュート・テーブルの設定
スプライトは、32枚の“スプライト面”にそれぞれ1つずつ表示され、そのスプライトの状態はスプライト面ごとに4バイトのメモリを用いて記録されます。スプライト面ごとの情報を記憶したこの領域を、スプライトアトリビュート・テーブルといいます。スプライトアトリビュート・テーブルはVRAM上にとられ、R#5とR#11でその先頭アドレスを設定します。
アトリビュート中の4バイトは、以下の情報を表しています。
Y座標:スプライトのY座標を指定する。ただし、画面最上段のラインは0ではな く、255。この値を208(D0H)に設定すると、そのスプライト面以降のスプ ライトは表示されない X座標:スプライトのX座標を指定する パターン番号:スプライトパターン・ジェネレータテーブル中のどのキャラクタを表示す るかを指定する 色コード:スプライトのパターンのビットが“1”である部分の色(パレット番号)を指 定する EC:このビットを“1”にすると、スプライトは左へ32ドット分シフトされる。 この機能を使用すると、画面の左端からスプライトを1ドットずつ出現さ せることができる
図4.61 スプライトアトリビュート・テーブルの構造(スプライトモード1)
5.2.3 スプライトの衝突判定
2個のスプライトが衝突した時、S#0のビット5が“1”になって衝突の発生を知らせます。ここで“衝突”とは、“透明色”ではない色のスプライトパターン中の“1”のビット同士が同一座標を占めた場合を指します(図4.62)。
図4.62 スプライトの衝突(スプライトモード1)
同一ラインに5個以上のスプライトが並んだ時には、S#0のビット6が“1”となり、さらにS#0の下位5ビットに、5番目(表示できなくなった部分)のスプライト番号がセットされます。
図4.63 衝突の判定(スプライトモード1)
5.3 スプライトモード2
スプライトモード2は、MSX-VIDEOで親切されたモードです。したがって、TMS9918との互換性はありません。
5.3.1 最大表示数
1画面に表示できるスプライトの数はやはり32個ですが、画面の同一水平ライン上には優先度の高い8つまで表示できます。9番目以降のスプライトの重なった部分は表示されません。
図4.64 スプライトの最大表示数(スプライトモード2)
5.3.2 スプライト表示のための諸設定
●スプライトサイズ………スプライトモード1と同様。
●スプライトの拡大………スプライトモード1と同様。
●スプライト表示のON/OFF
スプライトモード2では、R#8のビット1によってスプライトの表示をON/OFFすることができます。スプライトがまったく画面に現れない場合、このビットが“1”に設定されている可能性があります。
図4.65 スプライト表示の指定
●パターンジェネレータ・テーブルの設定………スプライトモード1と同様。
●スプライトアトリビュート・テーブル
スプライトモード2ではスプライトの横1ラインごとに異なった色を付けることが可能となり、そのため色情報はスプライトアトリビュート・テーブルから独立して、次に述べるスプライトカラーテーブルに記憶されることになりました。スプライトアトリビュート・テーブルには、以下の3種類の情報が格納されます(図4.66)。
Y座標:この値を216(D8H)に設定すると、そのスプライト面以降のスプライトは表 示されなくなる。それ以外はスプライトモード1と同様 X座標:スプライトモード1と同様 パターン番号:スプライトモード1と同様
図4.66 スプライトアトリビュート・テーブルの構造(スプライトモード2)
●スプライトカラーテーブル
カラーテーブルは、スプライトアトリビュート・テーブルの先頭アドレス-512の位置に自動的に設定されます。各スプライト面に対して16バイトの領域がとられ、それぞれスプライトの1ラインごとに以下のような設定を行います。
色コード:1ラインごとに色指定可能。 EC:スプライトモード1のアトリビュートテーブルのECビットと同様、“1”である ときはスプライトの表示位置が左へ32ドット分シフトされる。これも1ラインご とに指定可能。 CC:CCビットが“1”の場合、「このスプライトよりも優先順位が高く、かつCCビ ットが“0”で、最もこのスプライト面に近い」スプライトと等しい優先順位が 得られる。等しい優先順位を持つスプライトが重なった場合には、その両者の色 コードのOR(論理輪)をとったものが表示される。この場合、重なっても衝突は発 生しない(図4.68参照)。 IC:このビットが“1”であるスプライト(の1ライン)は、他のスプライトとの衝突 を発生しない。
図4.67 スプライトカラーテーブルの構造(スプライトモード2)
注1)CCを1にしたスプライトは、そのスプライトより若い番号で最もそのスプライトに近いスプライトのCC=0の部分とパターンが重なっても衝突の検出は行われない。
2)CC=1のスプライトを表示させるには、表示させたいスプライトより若い番号のスプライトのccbitを0にしなければならない。
図4.68 cc bitの意味
5.3.3 スプライトの衝突判定
スプライトモード2における“衝突”とは、スプライトの表示色が透明でなく、かつCCビットが0であるライン上の“1”のビット同士が重なった場合をいいます。2つのスプライトが衝突した場合はS#0のビット5が“1”になり、衝突が検出できます(図4.69)。この時スプライトモード1と異なり、衝突の発生した座標を図4.70のようにS#3〜S#6によって知ることができます。ただし、これらのレジスタにより得られる座標は、実際に衝突が起こった座標ではありません。それを求めるには式4.5で算出してください。なお、S#3〜S#6はS#5を読み出した時にリセットされます。
図4.69 スフライトの衝突(スプライトモード2)
図4.70 衝突座標の読み出し
(衝突が起こったX座標)=(S#3、S#4のX座標)-12 (衝突が起こったY座標)=(S#5、S#6のY座標)-8
式4.5 実衝突座標の算出
同一水平ライン上に9個以上のスプライトが並んだ時には、S#0のビット6が“1”になり、さらにS#0の下位5ビットに9番目に優先順位の低いスプライト面の番号が入ります(図4.71)。
図4.71 スプライトの衝突(スプライトモード2)