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プログラムの本などを見てアルゴリズムを学ぶのもいいと思います。
次に、画像ファイルを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 画像加工ツールの使い方を参照してください。
#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画像の表示
#ref(): File not found: "clip_1.png" at page "tutorial.3"