スプライトの仕組みを詳しく知る近道には、そのデータ構造(attr0~2)に値を入れていくことです。attr2の12-15bit目、パレット指定用の関数を用意してみましょう。 キャラクタデータはそのままに、パレットが異なる表示を実現できます。
void SpriteSetPalNo(u32 num, u32 palNo) { OBJATTR* sp = (OBJATTR*)OAM + num; sp->attr2 &= 0x0fff; sp->attr2 |= (palNo << 12); }
int main(void) { SetMode(MODE_0 | OBJ_ENABLE | OBJ_1D_MAP); u16* oam = OBJ_BASE_ADR; // キャラクタデータ u16* pal = OBJ_COLORS; // パレットデータ u32 i; // キャラクタの格納 for(i=0; i<sprTilesLen/2; i++) { oam[i] = sprTiles[i]; } // パレットの格納 for(i=0; i<16; i++) { pal[i] = sprPal[i]; pal[i+16] = sprPal[i]; pal[i+32] = sprPal[i]; } // 一部の色を書き換えます pal[16*1 + 2] = RGB5(0,31,0); pal[16*2 + 2] = RGB5(0,0,31); SpriteInit(); // スプライト0(パレット0) SpriteSetSize (0, OBJ_SIZE(Sprite_16x16), OBJ_SQUARE, OBJ_16_COLOR); SpriteSetChr (0, 0); SpriteMove (0, 20, 20); // スプライト1(パレット1) SpriteSetSize (1, OBJ_SIZE(Sprite_16x16), OBJ_SQUARE, OBJ_16_COLOR); SpriteSetChr (1, 0); SpriteMove (1, 40, 20); SpriteSetPalNo(1, 1); // スプライト2(パレット2) SpriteSetSize (2, OBJ_SIZE(Sprite_16x16), OBJ_SQUARE, OBJ_16_COLOR); SpriteSetChr (2, 0); SpriteMove (2, 60, 20); SpriteSetPalNo(2, 2); for(;;) { WaitForVsync(); } }
透明色は16色バレットでいうと0, 16, 32・・・番目となっています。こちらは固定値です。