libnds コンソールで ANK コード(日本語)表示(3)。


RGKT-NDS-STDY-020(003)


一昨日書き終えてそのままなコードです。
半角カタカナ→半角ひらがなデモコードです。
フォント切替の説明(ConsoleFont 構造体に値セットして、consoleSetFont() でフォント切替してる箇所)と、
変換関数のコメントとか含んでるので
少しソース長めです。


example の custom_font ベタなのもアレなので
多少違う風になってます。
4ビットカラー(16色)フォントを使ってみたいときは
example のサンプルコードを見てみると良いです。


…えちーな絵とか妖怪の絵とか
描いてたら楽しくて昨日1日終わっちったとですw
水木先生の描く夜叉難しい!
墓場鬼太郎の2話でドラキュラ四世と戦ってたやつ。
あの毛むくじゃら、どうにかならんもんですかね?
エロい方は塗りを何とか見れるものにして、ちゃんと背景まで書き足せば
多少見れるくらいに上達してきたかな…?
自画自賛な域だから人に見てもらうまで何とも言えないけど。(汗
てか、最近全然リソース作ってないよ!
コーディングばっかりでサンプルソース用の画像とか困ってるよ!<ラスターとかの
CG集とか激しく作りたい気分。勿論エロで!


閑話休題
結構決めうちコードで、1つの配列にカタカナとひらがなを共存することができないのが難点です。
個人的にこれはなんとかしたいと思うんで適当な
自前関数内(strConvHiragana)専用のエスケープシーケンスをでっち上げて対応するかもです。


※追記
自作のエスケープシーケンスは蹴られる模様。
'\' のみでは比較式で引っ掛けることできず。
'\\' で引っ掛ける場合、文字列の中も '\\' との記述が必要で
例えば '\h' をひらがな変換としたくても
実際は "\\h" という風に文字列に入れとかないとコンパイラが拾ってくれない。
'\' を使った自作エスケープシーケンスは一先ず諦めて、
'-' とかにして、オプション指定で変換を切替るようにしようと思います。


フォントリソースは CAVE だもんね(15)。 のものを使ってます。


CAVE だもんね(15)。
http://d.hatena.ne.jp/dumbo001/20090322/1237762244
main.c

//---------------------------------------------------------------------------------
#include <nds.h>
#include <stdio.h>
#include "font.h"

// 配列要素数カウント用マクロ。
#define countof(array) (sizeof(array)/sizeof((array)[0]))

//---------------------------------------------------------------------------------
// 
// ■書式
// void strConvHiragana(char *hira, const char *kata);
// 
// ■引数
// char *hira       : 半角ひらがなに変換した文字列の保存先
// const char *kata : 半角ひらがなに変換する文字列の参照先
// 
// ■説明
// 半角カタカナ(ANK コード)を 半角ひらがな(MSX 独自コード)へ変換する。
// 参照先 kata が指す文字列に含まれる半角カタカナを半角ひらがなに変換して、
// 保存先 hira が指す配列にコピーする。
// 
// ■注意
// 保存先が参照先より配列数が少ない場合を考慮してない為、
// 利用時には、参照先と同じ配列数かそれ以上の保存先を用意して使用すること。
// 参照先の文字列が終端文字を持たない場合の動作は未定義の為、
// 参照先は必ず終端文字で終わる文字列としてください。
// 参照先と保存先が重なる場合の動作は未定義の為、そのような利用は避けること。
// 
//---------------------------------------------------------------------------------
void strConvHiragana(char *hira, const char *kata)
{
	int i = 0;
	
	while(kata[i]){
		
		// "ヲ〜ッ" または "ア〜ソ" の範囲だった場合、ひらがなへ変換する。
		if(((kata[i] >= 0xA6) && (kata[i] <= 0xAF)) || ((kata[i] >= 0xB1) && (kata[i] <= 0xBF)))
			hira[i] = kata[i] - 0x20;
			
		// "タ〜ン" の範囲だった場合、ひらがなへ変換する。
		else if((kata[i] >= 0xC0) && (kata[i] <= 0xDD))
			hira[i] = kata[i] + 0x20;
			
		// それ以外の文字だった場合、無変換とする。
		else
			hira[i] = kata[i];
			
		i++;
	}
	
	// 最後に終端文字を入れる。
	hira[i] = kata[i];
}
//---------------------------------------------------------------------------------
// 
// ■書式
// void clearStrBuff(char *str_buff, const int str_num);
// 
// ■引数
// char *str_buff    : クリアしたい文字列を指定する。
// const int str_num : クリアしたい文字列の配列数を指定する。
// 
// ■返値
// なし
// 
// ■説明
// 指定した文字列をクリア(初期化)する。
// 
// ■注意
// クリアしたい文字列と要素数が一致しない場合の動作は保障されない。
// 指定した文字列と配列数に違いがないよう注意すること。
// 
//---------------------------------------------------------------------------------
void clearStrBuff(char *str_buff, const int str_num)
{
	int i;
	
	for(i = 0;i < str_num;i++)
		str_buff[i] = '\0';
}
//---------------------------------------------------------------------------------
int main(void)
{
	// カタカナ -> ひらがな 変換した文字列の一時保存先。
	char str_buff[100] = {0};
	
	// ANK コードを表示するには予め先に、変数に文字列をセットしておく必要があるため、
	// ここで文字列を持たせる(処理系の問題。)。
	const char str_1_1[] = "MSX2J-font ノ ";
	const char str_1_2[] = "カタカナ ";
	const char str_1_3[] = "ヲ";
	const char str_2_1[] = "ヒラガナ ニ ヘンカン シマース ";
	const char str_2_2   = 0x81; // "はぁと"
	
	//フォント変更を適用するコンソールステータスを PrintConsole 構造体で持つ。
	PrintConsole console = *consoleDemoInit();
	
	//フォント再定義の為のフォントステータスを ConsoleFont 構造体で持つ。
	ConsoleFont font;
	
	// フォント画像データのある先頭アドレスを指定する。
	font.gfx = (u16*)fontTiles;
	
	// パレット定義データのある先頭アドレスを指定する。
	// 但しシングルカラーモードの場合、この指定は意味を成さない。
	font.pal = (u16*)fontPal;
	
	// パレット定義されてる色数を指定する。
	// 但しシングルカラーモードの場合、この指定は意味を成さない。
	// 16 : 4ビットカラー, 256 : 8ビットカラー
	font.numColors =  fontPalLen / 2;
	
	// フォント描画のカラーモードを指定する。
	// 4 : 16色モード, 8 : 256色モード
	font.bpp = 4;
	
	// アスキーコード開始オフセットを指定する。
	// フルセットある場合は 0 、空白スペースから始まるようなら 32 という風に、
	// アスキーコードに準じた指定をする必要がある。
	font.asciiOffset = 0;
	
	// 利用可能とするキャラクタ数を指定する。
	// アスキーコード開始オフセットで定義した位置から数えて何文字までを利用可能とするか指定する。
	font.numChars = 256;
	
	// シングルカラーモードを利用するかどうか指定する。
	// 
	// true  : シングルカラー有効。透明色以外は全て同一色に変換されてマッピングされる。
	//         この場合パレットデータは読み込まれず、
	//         0 番カラーを透明色に、デフォルトカラー(255 番カラー)をフォント色として設定される。
	// 
	// false : シングルカラー無効。元のフォントデータの色通りに展開、マッピングされる。
	// 
	font.convertSingleColor = true;
	
	// 設定変更を行ったフォントステータスを現在のコンソールステータスに適用する。
	consoleSetFont(&console, &font);
	
	iprintf("MSX2J font demo\n");
	iprintf("   by AYUMI.KAWAI\n");
	iprintf("(C)2009 REGEKATSU\n");
	
	iprintf("\n\nvoid strConvHiragana\n(char *hira, const char *kata)\n\n");
	
	// "MSX2J-font の"
	clearStrBuff(str_buff, countof(str_buff));
	strConvHiragana(str_buff, str_1_1);
	iprintf("%s", str_buff);
	
	// "カタカナ "
	iprintf("%s", str_1_2);
	
	// "を"
	clearStrBuff(str_buff, countof(str_buff));
	strConvHiragana(str_buff, str_1_3);
	iprintf("%s\n", str_buff);
	
	// "ひらがな に へんかん しまーす "
	clearStrBuff(str_buff, countof(str_buff));
	strConvHiragana(str_buff, str_2_1);
	iprintf("%s", str_buff);
	
	// 'はぁと'
	iprintf("%c\n", str_2_2);
	
	while(1) {
		swiWaitForVBlank();
	}

	return 0;
}