Tutorial.17 拡大縮小(1)

BGやスプライトを拡大縮小させることができます。

タイルモードモード1のBG2、モード2のBG2,BG3
ビットマップモードBG2のみ
スプライトすべて(128個)

REG_BGxPA〜PD

拡大縮小パラメータは4つの数値(PA,PB,PC,PD)で指定します。
パラメータはI/OレジスタのREG_BG2PA〜PDとREG_BG3PA〜PDがあり、
BG2用とBG3用に分かれています。

#define REG_BG2PA	*((vu16 *)(REG_BASE + 0x20))
#define REG_BG2PB	*((vu16 *)(REG_BASE + 0x22))
#define REG_BG2PC	*((vu16 *)(REG_BASE + 0x24))
#define REG_BG2PD	*((vu16 *)(REG_BASE + 0x26))
#define REG_BG2X	*((vu32 *)(REG_BASE + 0x28))
#define REG_BG2Y	*((vu32 *)(REG_BASE + 0x2c))

#define REG_BG3PA	*((vu16 *)(REG_BASE + 0x30))
#define REG_BG3PB	*((vu16 *)(REG_BASE + 0x32))
#define REG_BG3PC	*((vu16 *)(REG_BASE + 0x34))
#define REG_BG3PD	*((vu16 *)(REG_BASE + 0x36))
#define REG_BG3X	*((vu32 *)(REG_BASE + 0x38))
#define REG_BG3Y	*((vu32 *)(REG_BASE + 0x3c))

拡大縮小パラメータの4つの数値を組み合わせることで、
さまざまな効果を出すことができるのです。

今回は拡大縮小のための最小限の解説を行います。
このパラメータの基本(元と同じ画像を表示)は、PAから順番に256,0,0,256です。

拡大・縮小して表示したい場合は、
縦の変化率がPAとPB、横の変化率が、PCとPDに一定の値をかけます。

かける値は倍率の逆数になります。
つまり、2倍にして表示したい場合は2で割ればいいことになって、
逆に1/2に表示したい場合は2をかけます。

倍率PA〜PD
200%128, 0, 0, 128
100%256, 0, 0, 256
50%512, 0, 0, 512

画像縮小(50%)の表示例

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

//---------------------------------------------------------------------------
void WaitForVsync(void)
{
	while(*(vu16*)0x4000006 >= 160) {};
	while(*(vu16*)0x4000006 <  160) {};
}
//---------------------------------------------------------------------------
// BG2の縦・横の拡大率を%で指定
void ScaleBG2(u32 xsc, u32 ysc)
{
	REG_BG2PA = 256 * 100 / xsc;
	REG_BG2PB = 0;
	REG_BG2PC = 0;
	REG_BG2PD = 256 * 100 / ysc;
}
//---------------------------------------------------------------------------
int main(void)
{
	// モード設定
	SetMode(MODE_3 | BG2_ENABLE);

	// 画像の読み込み
	REG_DMA3SAD = (u32)&imageBitmap;
	REG_DMA3DAD = (u32)VRAM;
	REG_DMA3CNT = (u32)(240*160) | (DMA_SRC_INC | DMA_DST_INC | DMA16 | DMA_ENABLE);

	ScaleBG2(50, 50);

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

動作画面

clip_1.png

履歴

  • 2015/01/04
  • 2007/09/08

添付ファイル: fileclip_1.png 213件 [詳細]

Last-modified: 2015-01-04 (日) 22:47:47 (2778d)