Tutorial.3 ビットマップモード(2)

応用してみよう

1ドットごとに点を打つことができるようになりましたので
いろいろな描画ができるようになると思います。

// モード3で四角形を塗りつぶす
void Mode3DrawBox(u32 sx, u32 sy, u32 ex, u32 ey, u16 col)
{
	u32 x, y;
	
	for(y=sy; y<ey; y++)
	{
		for(x=sx; x<ex; x++)
		{
			Mode3PutPixel(x, y, col);
		}
	}
}

他にも、直線を引いたり、円や三角形を描画することもできます。
直線の描画は、有名なブレゼンハムのアルゴリズムなどを検索してみてください。
CGプログラムの本などを見てアルゴリズムを学ぶのもいいと思います。

png画像をGBAで表示する

次に、画像ファイルをGBA上に表示させてみる関数を考えてみます。
画像は液晶画面のサイズに合わせた240x160ドットなので、内容は以下のようになります。

void Mode3DrawImage(u16* img)
{
	u16* ScreenBuffer = (u16*)0x6000000;
	u32 x, y;
	
	for(y=0; y<160; y++)
	{
		for(x=0; x<240; x++)
		{
			ScreenBuffer[y*240+x] = img[y*240+x];
		}
	}
}

引数の画像データ(色データ)の配列から1つ1つを描画をしていきます。
この配列をどのように生成するかですが、devkitProに標準装備されているgritというツールを
使用して出力するのが手っ取り早いです。使い方はDoc.3 画像加工ツールの使い方を参照してください。

モード3での画像表示

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

//---------------------------------------------------------------------------
void WaitForVsync(void)
{
	while(*(vu16*)0x4000006 >= 160) {};
	while(*(vu16*)0x4000006 <  160) {};
}
//---------------------------------------------------------------------------
void Mode3DrawImage(u16* img)
{
	u16* ScreenBuffer = (u16*)0x6000000;
	u32  x, y;

	for(y=0; y<160; y++)
	{
		for(x=0; x<240; x++)
		{
			ScreenBuffer[y*240+x] = img[y*240+x];
		}
	}
}
//---------------------------------------------------------------------------
int main(void)
{
	// モード設定
	SetMode(MODE_3 | BG2_ENABLE);

	// 画像の読み込み
	Mode3DrawImage((u16*)&imageBitmap);

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

動作画面

モード3で、240x160のpng画像の表示

clip_1.png

履歴

  • 2014/12/21

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

Last-modified: 2014-12-21 (日) 17:56:28 (2703d)