#author("2023-05-25T18:25:25+09:00","","") #author("2023-05-30T10:42:08+09:00","","") * スプライト2 [#i0fc0358] スプライトの仕組みを詳しく知る近道は、そのデータ構造(attr0~2)に値を入れていくことです。attr2の12-15bitに、パレット指定できる関数を用意してみましょう。 キャラクタデータはそのままに、パレットが異なる表示を実現できます。 void SpriteSetPalNo(u32 num, u32 palNo) { OBJATTR* sp = (OBJATTR*)OAM + num; sp->attr2 &= 0x0fff; sp->attr2 |= (palNo << 12); } ** スプライトとパレットの組み合わせ例 [#g5df9fa7] 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・・・番目となっています。こちらは固定値です。 透明色は16色パレットでいうと0, 16, 32, 48・・・番目となっています。こちらは固定値です。 *** 動作画面とPalette View [#h0b8bf1f] #ref(1.png,nolink) #ref(2.png,nolink) ** 履歴 [#dd842928] - 2023/04/24 - 2014/12/25