// 第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番目以降のスプライトの重なった部分は表示されません。 {{div_begin style='text-align:center;'}} {{svg 図4.57.svg,,size:500x320}} '''図4.57 スプライトの最大表示数(スプライトモード1)''' {{div_end}} !5.2.2 スプライト表示のための諸設定  スプライトを表示するために必要な諸設定を以下に示します。 ●スプライトのサイズの設定  8×8ドットまたは16×16ドットのどちらかを設定します(図4.58)。デフォルト(省略値)は8×8ドットになっています。 {{div_begin style='text-align:center;'}} {{svg 図4.58.svg,,size:560x450}} '''図4.58 スプライトのサイズの設定''' {{div_end}} ●スプライトの拡大  スプライトの1ドットを画面の1ドットに対応させるか、または縦横2倍に拡大するかを設定します(図4.59)。デフォルトは1対1の対応になっています。 {{div_begin style='text-align:center;'}} {{svg 図4.59.svg,,size:550x510}} '''図4.59 スプライトの拡大''' {{div_end}} ●スプライトパターン・ジェネレータテーブルの設定  VRAM上のスプライトパターン・ジェネレータテーブルにスプライトのパターンを定義します。スプライトパターンは、8×8ドットの時256個、16×16の時64個まで定義可能です。各パターンには0〜255のパターン番号が与えられ、図4.60のようにVRAMに配置されます。16×16ドットの場合は、テーブルの先頭から8×8サイズのパターンが4つずつ使われます。この時4つのパターンのどの番号を用いても、同じスプライトが指定されます。スプライトパターン・ジェネレータテーブルにアドレスを設定するためには、図4.60のようにR#6を使用します。 {{div_begin style='text-align:center;'}} {{svg 図4.60.svg,,size:590x280}} '''図4.60 スプライトパターン・ジェネレータテーブルの構造(スプライトモード1)''' {{div_end}} ●スプライトアトリビュート・テーブルの設定  スプライトは、32枚の“スプライト面”にそれぞれ1つずつ表示され、そのスプライトの状態はスプライト面ごとに4バイトのメモリを用いて記録されます。スプライト面ごとの情報を記憶したこの領域を、スプライトアトリビュート・テーブルといいます。スプライトアトリビュート・テーブルはVRAM上にとられ、R#5とR#11でその先頭アドレスを設定します。  アトリビュート中の4バイトは、以下の情報を表しています。 Y座標:スプライトのY座標を指定する。ただし、画面最上段のラインは0ではな く、255。この値を208(D0H)に設定すると、そのスプライト面以降のスプ ライトは表示されない X座標:スプライトのX座標を指定する パターン番号:スプライトパターン・ジェネレータテーブル中のどのキャラクタを表示す るかを指定する 色コード:スプライトのパターンのビットが“1”である部分の色(パレット番号)を指 定する EC:このビットを“1”にすると、スプライトは左へ32ドット分シフトされる。 この機能を使用すると、画面の左端からスプライトを1ドットずつ出現さ せることができる {{div_begin style='text-align:center;'}} {{svg 図4.61.svg,,size:790x560}} '''図4.61 スプライトアトリビュート・テーブルの構造(スプライトモード1)''' {{div_end}} !5.2.3 スプライトの衝突判定  2個のスプライトが衝突した時、S#0のビット5が“1”になって衝突の発生を知らせます。ここで“衝突”とは、“透明色”ではない色のスプライトパターン中の“1”のビット同士が同一座標を占めた場合を指します(図4.62)。 {{div_begin style='text-align:center;'}} {{svg 図4.62.svg,,size:660x400}} '''図4.62 スプライトの衝突(スプライトモード1)''' {{div_end}}  同一ラインに5個以上のスプライトが並んだ時には、S#0のビット6が“1”となり、さらにS#0の下位5ビットに、5番目(表示できなくなった部分)のスプライト番号がセットされます。 {{div_begin style='text-align:center;'}} {{svg 図4.63.svg,,size:550x140}} '''図4.63 衝突の判定(スプライトモード1)''' {{div_end}} !!5.3 スプライトモード2  スプライトモード2は、MSX-VIDEOで新設されたモードです。したがって、TMS9918との互換性はありません。 !5.3.1 最大表示数  1画面に表示できるスプライトの数はやはり32個ですが、画面の同一水平ライン上には優先度の高い8つまで表示できます。9番目以降のスプライトの重なった部分は表示されません。 {{div_begin style='text-align:center;'}} {{svg 図4.64.svg,,size:520x320}} '''図4.64 スプライトの最大表示数(スプライトモード2)''' {{div_end}} !5.3.2 スプライト表示のための諸設定 ●スプライトサイズ………スプライトモード1と同様。 ●スプライトの拡大………スプライトモード1と同様。 ●スプライト表示のON/OFF  スプライトモード2では、R#8のビット1によってスプライトの表示をON/OFFすることができます。スプライトがまったく画面に現れない場合、このビットが“1”に設定されている可能性があります。 {{div_begin style='text-align:center;'}} {{svg 図4.65.svg,,size:480x140}} '''図4.65 スプライト表示の指定''' {{div_end}} ●パターンジェネレータ・テーブルの設定………スプライトモード1と同様。 ●スプライトアトリビュート・テーブル  スプライトモード2ではスプライトの横1ラインごとに異なった色を付けることが可能となり、そのため色情報はスプライトアトリビュート・テーブルから独立して、次に述べるスプライトカラーテーブルに記憶されることになりました。スプライトカラーテーブルの先頭アドレスはアトリビュートテーブルと同じR#11,#5で指定されます。この時、カラーテーブルは上位7bit、アトリビュートテーブルは上位8bitまで参照されます。このためA9を"0"にするとアトリビュートテーブルとカラーテーブルが重なってしまいます。A9は必ず"1"を指定するようにしてください。スプライトアトリビュート・テーブルには、以下の3種類の情報が格納されます(図4.66)。 Y座標:この値を216(D8H)に設定すると、そのスプライト面以降のスプライトは表 示されなくなる。それ以外はスプライトモード1と同様 X座標:スプライトモード1と同様 パターン番号:スプライトモード1と同様 {{div_begin style='text-align:center;'}} {{svg 図4.66.svg,,size:730x410}} '''図4.66 スプライトアトリビュート・テーブルの構造(スプライトモード2)''' {{div_end}} ●スプライトカラーテーブル  スプライトカラーテーブルは、スプライトアトリビュート・テーブルと同じくR#11,R#5で指定された位置に自動的に設定されます。各スプライト面に対して16バイトの領域がとられ、それぞれスプライトの1ラインごとに以下のような設定を行います。 色コード:1ラインごとに色指定可能。 EC:スプライトモード1のアトリビュートテーブルのECビットと同様、“1”である ときはスプライトの表示位置が左へ32ドット分シフトされる。これも1ラインご とに指定可能。 CC:CCビットが“1”の場合、「このスプライトよりも優先順位が高く、かつCCビ ットが“0”で、最もこのスプライト面に近い」スプライトと等しい優先順位が 得られる。等しい優先順位を持つスプライトが重なった場合には、その両者の色 コードのOR(論理輪)をとったものが表示される。この場合、重なっても衝突は発 生しない(図4.68参照)。 IC:このビットが“1”であるスプライト(の1ライン)は、他のスプライトとの衝突 を発生しない。 {{div_begin style='text-align:center;'}} {{svg 図4.67.svg,,size:730x610}} '''図4.67 スプライトカラーテーブルの構造(スプライトモード2)''' {{div_end}} {{div_begin style='text-align:center;'}} {{svg 図4.68.svg,,size:670x240}} '''図4.68 cc bitの意味''' {{div_end}} !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を読み出した時にリセットされます。 {{div_begin style='text-align:center;'}} {{svg 図4.69.svg,,size:700x450}} '''図4.69 スフライトの衝突(スプライトモード2)''' {{div_end}} {{div_begin style='text-align:center;'}} {{svg 図4.70.svg,,size:490x260}} '''図4.70 衝突座標の読み出し''' {{div_end}} (衝突が起こったX座標)=(S#3、S#4のX座標)-12 (衝突が起こったY座標)=(S#5、S#6のY座標)-8 {{div_begin style='text-align:center;'}} '''式4.5 実衝突座標の算出''' {{div_end}}  同一水平ライン上に9個以上のスプライトが並んだ時には、S#0のビット6が“1”になり、さらにS#0の下位5ビットに9番目に優先順位の低いスプライト面の番号が入ります(図4.71)。 {{div_begin style='text-align:center;'}} {{svg 図4.71.svg,,size:430x180}} '''図4.71 スプライトの衝突(スプライトモード2)''' {{div_end}}