- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2023-05-15T09:51:44+09:00;2023-04-24T19:14:55+09:00","","")
#freeze
#author("2023-05-30T10:42:08+09:00","","")
* スプライト2 [#i0fc0358]
スプライトの仕組みを詳しく知る近道には、そのデータ構造(attr0~2)に値を入れていくことです。attr2の12-15bit目、パレット指定用の関数を用意してみましょう。
スプライトの仕組みを詳しく知る近道は、そのデータ構造(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