テクハンwiki

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ラインごとに異なった色を付けることが可能となり、そのため色情報はスプライトアトリビュート・テーブルから独立して、次に述べるスプライトカラーテーブルに記憶されることになりました。スプライトカラーテーブルの先頭アドレスはアトリビュートテーブルと同じR#11,#5で指定されます。この時、カラーテーブルは上位7bit、アトリビュートテーブルは上位8bitまで参照されます。このためA9を"0"にするとアトリビュートテーブルとカラーテーブルが重なってしまいます。A9は必ず"1"を指定するようにしてください。スプライトアトリビュート・テーブルには、以下の3種類の情報が格納されます(図4.66)。

       Y座標:この値を216(D8H)に設定すると、そのスプライト面以降のスプライトは表
             示されなくなる。それ以外はスプライトモード1と同様
       X座標:スプライトモード1と同様
パターン番号:スプライトモード1と同様


図4.66 スプライトアトリビュート・テーブルの構造(スプライトモード2)

●スプライトカラーテーブル
 スプライトカラーテーブルは、スプライトアトリビュート・テーブルと同じくR#11,R#5で指定された位置に自動的に設定されます。各スプライト面に対して16バイトの領域がとられ、それぞれスプライトの1ラインごとに以下のような設定を行います。

色コード:1ラインごとに色指定可能。
      EC:スプライトモード1のアトリビュートテーブルのECビットと同様、“1”である
         ときはスプライトの表示位置が左へ32ドット分シフトされる。これも1ラインご
         とに指定可能。
      CC:CCビットが“1”の場合、「このスプライトよりも優先順位が高く、かつCCビ
         ットが“0”で、最もこのスプライト面に近い」スプライトと等しい優先順位が
         得られる。等しい優先順位を持つスプライトが重なった場合には、その両者の色
         コードのOR(論理輪)をとったものが表示される。この場合、重なっても衝突は発
         生しない(図4.68参照)。
      IC:このビットが“1”であるスプライト(の1ライン)は、他のスプライトとの衝突
         を発生しない。


図4.67 スプライトカラーテーブルの構造(スプライトモード2)


図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)