#author("2023-04-20T22:41:47+09:00","","")
* Tutorial.3 ビットマップモード(2) [#t3e84764]

** 応用してみよう [#x7b387ed]
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で表示する [#cb9ffcae]
次に、画像ファイルをGBA上に表示させてみる関数を考えてみます。~
画像は液晶画面のサイズに合わせた240x160ドットなので、内容は以下のようになります。~

 void Mode3DrawImage(u16* img)
 {
 	u16* ScreenBuffer = (u16*)0x6000000;
 	u16 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 画像加工ツールの使い方>doc.3]]を参照してください。~


** モード3での画像表示 [#l814af10]
 #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();
 	}
 }


***動作画面 [#m958e69b]
モード3で、240x160のpng画像の表示
#ref(clip_1.png,nolink)


** 履歴 [#p6ae87c6]
- 2014/12/21


トップ   一覧 検索 最終更新   ヘルプ   最終更新のRSS