スプライトとは8x8~64x64サイズの画像を最大128個まで表示し、シューティングゲームでいう自機や弾、RPGでいう主人公キャラなどに使います。
1画面あたり最大128個のOBJ(大きさは64×64ドットまで任意)を表示することができます。
8×8ドットの小さなサイズなら1行に最大128個のOBJを表示することができます。
1行あたり、OBJをレンダリングするのに使えるCPUサイクルの合計は
LCD制御レジスタのbit5("H-Blank Interval Free" bit)が
- 0のとき: 1210 (=304×4-6)
- 1のとき: 954 (=240×4-6)
となります。
またOBJのレンダリングに必要なサイクルは、OBJのX方向のピクセルサイズをnとすると次のようになります
サイクル | OBJ Type | OBJ Type Screen Pixel Range |
---|---|---|
n*1 cycles | Normal OBJs | 8..64 pixels |
10+n*2 cycles | Rotation/Scaling OBJs | 8..64 pixels (area clipped) |
10+n*2 cycles | Rotation/Scaling OBJs | 16..128 pixels (double size) |
プログラマはこれらの情報を用いて、OBJのレンダリングが間に合うように1行に表示するOBJを調整する必要があります。
1行あたりの最大OBJ数は、表示されているOBJよりも優先度の高い非表示(画面外)OBJの影響も受けます。
これを避けるには、表示したいOBJをなるべくOAMの前方に持ってきてください。
OBJ0が最も優先度が高く、OBJ127が最も優先度が低くなっています。
プログラムがOBJをOAMの固定位置にあることを前提としているなどの理由でそれができない場合、少なくとも、伸縮回転を無効にして、表示されていないOBJのサイズを8x8に設定することで余計な負荷を減らすことができます。
OBJは8×8のタイル単位で構成されています。
ただしOBJのタイルデータは背景のタイルデータとは別のメモリ領域に格納されています。BGモード0-2では 0x0601_0000-0601_7fff
(32KB) に、BGモード3-5では 0x0601_4000-0601_7fff
(16KB)に格納されています。
このOBJタイルデータ用のメモリ領域に、何枚のタイルを格納できるかは、メモリ領域のサイズ(16KB or 32KB)だけでなく、OBJの色深度にも依存しており、最小で256タイル、最大で1024タイル格納できます。
OAMは0x0700_0000-0700_03ff
にあります。 サイズは1KBです。詳細はOAMを参照してください。
OBJタイルは8×8pxを1単位としており、より大きなOBJは複数の8×8タイルを組み合わせることによって表示することができます。
各OBJのX方向とY方向のサイズは、個別にOAMで定義することができ、8,16,32,64ピクセルから選択可能です。よって組み合わせによって正方形だったり長方形のOBJを設定可能です。
複数の8×8タイルを含むOBJを表示する場合、LCD制御レジスタのbit6で指定することで、以下の2つのマッピングモードのいずれかを使用することができます。いずれの場合も、左上のタイルのタイル番号をOAMメモリに指定しなければなりません。
このマッピングモードでは、1024個のOBJタイルが32x32の行列(256色モードでは16x32の行列)として配置されていることを前提としています。
つまり、この行列の上段には0x00..1f、次の列には0x20..3fのタイルが含まれています。
# 16色/16パレット
00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0a, 0b, 0c, 0d, 0e, 0f, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1a, 1b, 1c, 1d, 1e, 1f
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2a, 2b, 2c, 2d, 2e, 2f, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3a, 3b, 3c, 3d, 3e, 3f
...
# 256色/1パレット
00, 02, 04, 06, 08, 0a, 0c, 0e, 10, 12, 14, 16, 18, 1a, 1c, 1e,
20, 22, 24, 26, 28, 2a, 2c, 2e, 30, 32, 34, 36, 38, 3a, 3c, 3e,
...
例えば、16x16ピクセルのOBJを表示する場合、タイル番号が0x04に設定されている場合、OBJの上段のタイルは0x04と0x05、次の行は0x24と0x25となります。(256色モードの場合は 0x04と0x06、0x24と0x26)
このモードでは1024個のOBJタイルが長さ0x3ffの配列として配置されていることを前提としています。
1次元という名前のとおり、16x16ピクセルのOBJを表示する場合、タイル番号が0x04に設定されている場合、OBJの上段のタイルは0x04と0x05、次の行は0x06と0x07となります。(256色モードの場合は 0x04と0x06、0x08と0x0a)