** Doc.12 日本語を表示する方法(タイルモード) [#v680c6e4]
前回につづいてタイルモードでの場合もやってみたいと思います。基本的には1つのタイルに対し、1文字分を格納して表示する方式です。


** タイルモードの表示例 [#ke3dd0e6]
 int main()
 {
 	InitBG();
 
 	BGDrawChr(BG3.map, 1, 1, 'A');
 
 	BGDrawStr(BG3.map, 1, 3, "0123 ABCD abcd +-*/");
 	BGDrawStr(BG3.map, 1, 4, "あいうえお アイウエオ");
 
 	for(;;)
 	{
 	    WaitForVsync();
 	}
 }


InitBG関数ではグラフィックに関わるすべての初期化処理を行っています。内容は以下のとおりです。


 void InitBG()
 {
 	BG3.chr =  1;
 	BG3.map =  0;
 	BG3.pal =  0;
 
 	BGSetPalData16((u16*)&BGSmall8FontPal, BG3.pal);
 	BGSetChrData  ((u16*)&BGSmall8FontTiles, BGSmall8FontTilesLen, BG3.chr);
 
 	REG_BG3CNT = (BG_SIZE_0 | BG_16_COLOR | CHAR_BASE(BG3.chr) | MAP_BASE(BG3.map)); 
 	SetMode(MODE_0 | BG3_ENABLE);
 }


BGSetPalData16、BGSetChrData関数はそれぞれのパレットデータとキャラクタデータを格納する関数です。ここでは説明を省略します。


 void BGDrawChr(u8 mapNo, u16 x, u16 y, u16 chr)
 {
 	u16* BGMap = (u16*)MAP_BASE_ADR(mapNo) + x + (y * 32);
 
 	*BGMap = chr;
 }
 
 void BGDrawStr(u8 mapNo, u16 x, u16 y, char* str)
 {
 	u16 chr;
 	u16 i=0, dx=0;
 
 	for(;;)
 	{
 		chr = str[i++];
 
 		if(chr == '\0') return;
 		if(chr ==  CR)  return;
 		if(chr ==  LF)  return;
 
 		if(chr <= 0x7f)
 		{
 			//1byte char
 			BGDrawChr(mapNo, x + dx, y, chr);
 		}
 		else
 		{
 			//2byte char
 
 			switch(chr)
 			{
 				case 0x82: chr = str[i++] - 0x90 + 192; break;
 				case 0x83: chr = str[i++] - 0x40 + 304; break;
 				default:   chr = str[i++];              break;
 			}
 
 			BGDrawChr(mapNo, x + dx, y, chr);
 		}
 		dx++;
 	}
 }


最後にBGDrawChr、BGDrawStr関数です。前回はテキストファイルの内容から文字のインデックスを求めていましたが、今回は文字コードを基準に位置を求めるようにしています。


*** 動作画面 [#mfaab8e4]
#ref(clip_1.png,nolink)


** 履歴 [#ucfeb54d]
- 2007/10/11