スプライト拡大縮小サンプル。


スプライトの拡大縮小を試してみました。
いつもの如く akkera102 さんとこの GBA Develop wiki の解説を参考に。
GBANDS の構造が近いのを良いことに参照しまくりです。


akkera102 さんの解説は凄く丁寧に書かれてて
理解した後だと上手く説明された文章だと分かるのですが
元々の構造がややこしい為、少しだけ理解に手間取ってしまいました。


回転のサンプルは devkitPro の example に有ったので
回してみたい人はそちらを参照してみてください。


等倍


2倍


1/2倍


プロジェクト一式
ttp://page.freett.com/ntr/example/sprscale.zip


ソース(ビルドには別途、スプライト画像データ・grit データが必要です。)


main.c

/*---------------------------------------------------------------------------------
	
	sprite scale up/down sample
	
	version 0.01
	Apr 22, 2010
	
	By REGEKATSU
	
---------------------------------------------------------------------------------*/

#include <stdio.h>
#include <nds.h>
#include "sprGfx.h"


//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
	
	u16 *gfx;
	u32 kdr;
	int scale = 256; //拡大縮小が行われてない標準サイズはスケール値 256 となっている。
	
	
	consoleDemoInit();
	keysSetRepeat(6, 3);
	
	
	//initVideoMode
	videoSetMode(MODE_0_2D);
	
	//initVRAMBank
	vramSetBankA(VRAM_A_MAIN_SPRITE);
	
	//initOAM
	oamInit(&oamMain, SpriteMapping_1D_32, false);
	
	//allocateOAM
	gfx = oamAllocateGfx(&oamMain, SpriteSize_8x8, SpriteColorFormat_16Color);
	
	//initSpriteTiles
	dmaCopy(sprGfxTiles, gfx, sprGfxTilesLen);
	
	//initSpritePalette
	dmaCopy(sprGfxPal, SPRITE_PALETTE, sprGfxPalLen);
	
	
	oamSet(&oamMain, 0, 16, 16, 0, 0, SpriteSize_8x8, SpriteColorFormat_16Color, &gfx[1 * 16], 
		
		//回転拡大縮小パラメータを 0〜31 から指定する。
		//oamRotateScale 関数にてパラメータを設定したのち、oamUpdate 関数を実行することで設定が更新・反映される。
		//回転拡大縮小を使用しない場合はそれ以外の値を指定(-1 等)。
		0, 
		
		//回転拡大縮小時のダブルサイズフラグを有効にする場合 true とする。
		//但しスプライト定義時のサイズ x2 を超えた部分は描画されない。
		//また、ダブルサイズフラグを true とした場合、
		//スプライトの中心位置がスプライトサイズの半分だけ右下方向に移動する。
		true, 
		
		false, false, false, false
	);
	
	
	printf("\x01b[0;0Hsprite scale up/down sample\n\nversion 0.01\nApr 22, 2010\n\nBy REGEKATSU\n\n\n"
		"KEY_UP :scale up\nKEY_DOWN:scale down\n\n");
	
	
	while(1){
		
		swiWaitForVBlank();
		
		//スプライト OAM の更新。
		oamUpdate(&oamMain);
		
		printf("\x01b[12;0H\x01b[2KScale value = %d", scale);
		
		scanKeys();
		kdr = keysDownRepeat();
		
		
		//スプライトを拡大する。
		if(kdr & KEY_UP){
			scale--;
			
		//スプライトを縮小する。
		}else if(kdr & KEY_DOWN){
			scale++;
			
		}
		
		//回転拡大縮小パラメータを設定する。
		oamRotateScale(&oamMain, 0, 0, scale, scale);
		
	}
	
}

//---------------------------------------------------------------------------------