スプライト2

スプライトの仕組みを詳しく知る近道は、そのデータ構造(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, 48・・・番目となっています。こちらは固定値です。

動作画面とPalette View

1.png
2.png

履歴


添付ファイル: file2.png 34件 [詳細] file1.png 32件 [詳細]

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-05-30 (火) 10:42:08