#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

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS