画面表示 > スプライト属性テーブル

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