Tutorial.8 スプライト(2)

応用してみよう

スプライトの仕組みを詳しく知る近道は、そのデータ構造(attr0〜2)に値を入れていくことです。

attr2の12-15bit目、パレット指定用の関数を用意してみましょう。
この関数を使うことで16色の異なる画像データを表示することができます。

void SpriteSetPalNo(u32 num, u32 palNo)
{
	OBJATTR* sp = (OBJATTR*)OAM + num;

	sp->attr2 &= 0x0fff;
	sp->attr2 |= (palNo << 12);
}

スプライトとパレットの組み合わせ例

#include "lib/gba.h"
#include "res.h"

//---------------------------------------------------------------------------
void WaitForVsync(void)
{
	while(*(vu16*)0x4000006 >= 160) {};
	while(*(vu16*)0x4000006 <  160) {};
}
//---------------------------------------------------------------------------
void SpriteSetPalNo(u32 num, u32 palNo)
{
	OBJATTR* sp = (OBJATTR*)OAM + num;

	sp->attr2 &= 0x0fff;
	sp->attr2 |= (palNo << 12);
}
//---------------------------------------------------------------------------
void SpriteMove(u32 num, s32 x, s32 y)
{
	OBJATTR* sp = (OBJATTR*)OAM + num;

	sp->attr1 &= 0xfe00;
	sp->attr0 &= 0xff00;
	sp->attr1 |= (x & 0x01ff);
	sp->attr0 |= (y & 0x00ff);
}
//---------------------------------------------------------------------------
void SpriteSetSize(u32 num, u32 size, u32 form, u32 col)
{
	OBJATTR* sp = (OBJATTR*)OAM + num;

	sp->attr0 &= 0x1fff;
	sp->attr1 &= 0x3fff;
	sp->attr0 |= col  | form | (160);
	sp->attr1 |= size | (240);
}
//---------------------------------------------------------------------------
void SpriteSetChr(u32 num, u32 ch)
{
	OBJATTR* sp = (OBJATTR*)OAM + num;

	sp->attr2 &= 0xfc00;
	sp->attr2 |= ch;
}
//---------------------------------------------------------------------------
void SpriteInit(void)
{
	u32 i;
	for(i=0; i<128; i++)
	{
		SpriteMove(i, 240, 160);
	}
}
//---------------------------------------------------------------------------
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<spr2TilesLen/2; i++)
	{
		oam[i+64] = spr2Tiles[i];
	}

	// パレットの格納
	for(i=0; i<16; i++)
	{
		pal[i] = sprPal[i];
	}
	for(i=0; i<16; i++)
	{
		pal[i+16] = spr2Pal[i];
	}

	SpriteInit();

	// スプライト0
	SpriteSetSize(0, OBJ_SIZE(Sprite_16x16), OBJ_SQUARE, OBJ_16_COLOR);
	SpriteSetChr (0, 0);
	SpriteMove   (0, 20, 20);

	// スプライト1+パレット0(正しく表示されない)
	SpriteSetSize(1, OBJ_SIZE(Sprite_16x16), OBJ_SQUARE, OBJ_16_COLOR);
	SpriteSetChr (1, 4);
	SpriteMove   (1, 40, 40);

	// スプライト2+パレット1
	SpriteSetSize (2, OBJ_SIZE(Sprite_16x16), OBJ_SQUARE, OBJ_16_COLOR);
	SpriteSetChr  (2, 4);
	SpriteMove    (2, 60, 40);
	SpriteSetPalNo(2, 1);


	for(;;)
	{
		WaitForVsync();
	}
}

動作画面とPalette View

clip_1.png
clip_2.png

履歴

  • 2014/12/25

添付ファイル: fileclip_2.png 235件 [詳細] fileclip_1.png 223件 [詳細]

Last-modified: 2014-12-25 (木) 20:39:54 (2788d)