8x8 ピクセル、または 8x16 ピクセルで、 40 個のスプライトを表示することができます。
ハードウェアの制限により、スプライトの表示は 1 スキャンラインごとに 10 個までになります。
スプライトのタイルパターンの形式は、背景タイルと同じ形式になっています。
また、スプライトのタイルパターンは VRAM の 8000 から 8FFF の範囲のデータを使用します。
0 から 255 の範囲の値を使用して、スプライト番号を指定します。
スプライト属性テーブル (OAM - Object Attribute Memory) は、 FE00 から FE9F の範囲にあり、
それぞれ 4 バイトの、 40 個のデータで構成されています (合計 160 バイト)。
バイト 0 - Y 座標
スプライトの垂直位置を指定します (16 引いた値)。
画面外の範囲が指定された時 (Y = 0 または Y >= 160)、スプライトは非表示になります。
バイト 1 - X 座標
スプライトの水平位置を指定します (8 引いた値)。
画面外の範囲が指定された時 (X = 0 または X >= 168)、スプライトは非表示になりますが、
優先度の設定の影響があるため、スプライトを非表示にする時は Y 座標時で範囲外を指定する方が良いです。
バイト 2 - タイル / パターン番号
スプライトのタイル番号 (00 から FF) を指定します。
タイル番号は、 8000 から 8FFF の範囲に配置されたタイルの、符号なし (unsigned) の番号を指定します。
ゲームボーイカラーモードでは、OAM の 3 バイト目のビット 3 の設定により、
VRAM バンク 0 と 1 のどちらも指定することができます。
8x16 サイズのスプライトを使用する場合、タイル番号の一番小さいビットは無視されます。
上の 8x8 タイルは "NN AND FEh" で選択され、下のタイルは "NN OR 01h" で選択されます。
バイト 3 - 属性 / フラグ
Bit7 スプライトと背景の優先度 (0 = 背景の上にスプライト、 1 = 背景色 1 - 3 の裏にスプライト)
(背景とウインドウの両方で使われます。スプライトは常に背景色 0 の裏に表示されます。)
Bit6 Y 反転 (0 = 反転しない、 1 = 垂直方向に反転)
Bit5 X 反転 (0 = 反転しない、 1 = 水平方向に反転)
Bit4 パレット番号 ** ゲームボーイカラーモードでない時のみ ** (0 = OBP0、 1 = OBP1)
Bit3 タイル VRAM バンク ** ゲームボーイカラーモードのみ ** (0 = バンク 0、 1 = バンク 1)
Bit2-0 パレット番号 ** ゲームボーイカラーモードのみ ** (OBP0 から OBP7)
スプライトの優先度と衝突
2 つ以上のスプライトが、それぞれ異なる X 座標で重なり合う時、 X 座標の小さい方 (画面左に近い方) が、上に表示されます。
この動作は、ゲームボーイカラーモードでない時にのみ適用されます。
スプライトが同じ X 座標で重なり合う時は、テーブル番号によって優先度が決まります。
(FE00: 最も優先度が高い、 FE04: その次に優先度が高い)
ゲームボーイカラーモードの時は、いつでもこの優先度の決め方が使われます。
また、1 行につき 10 個までのスプライトが表示できます。
この上限を超えた時、スプライトは表示されなくなります (優先度の決定方法は上記のようになります)。
未使用のスプライトも、この影響を受けるため、未使用の場合は Y 座標 Y = 0 または Y >= 144 + 16 に置いておく必要があります。
X 座標だけを X = 0 もしくは X >= 160 + 8 の範囲に指定しても非表示にはできますが、Y 座標が画面範囲内にあると、上記の影響を受けます。
OAM メモリへのデータの書き込み
OAM メモリへのデータの書き込み方法としては、次のようにするのがおすすめです。
- 最初に、普通の RAM へデータを書き込んでおく
- 次に、 DMA 転送機能を使って、 RAM から OAM へデータを転送する
DMA 転送機能は、 DMA レジスタ (FF46) から使用することができます。
OAM 領域へは、直接データを書き込むこともできますが、
書き込み処理が実行できるのは、 H-Blank 期間、 V-Blank 期間に限られます。
LCD
コントローラの現在の状態は、 STAT レジスタ (FF41) から読み込むことができます。
最終更新:2017年08月30日 17:17