ページ 11

名前の入力画面

Posted: 2009年3月30日(月) 11:55
by s-rush
いつもお世話になってます。

今RPGによく見かける主人公等の名前の入力画面を実装しています。
仕様としては、キーボードからの直接入力ではなく、
RPGで一般的な文字を選択するタイプを考えています。
イメージ図を張らせていただきます。

しかし、この制御をするよいアイデアが思いつきません。
というのも、文字にはひらがな、カタカナ、アルファベット(全角大文字)と
個の3種類がおもに用いられると思うのですが、
馬鹿正直に座標ですべてを制御するなら、swtich文で、約120通りの条件わけをする必要があると思います。
でもこのようにしてしまうと、120通りの条件わけをするのも面倒ですし、
何よりソースコードが無駄に長くなってしまい、デバッグも大変になると思います。

この文字を選択する制御の部分で、良いアイデアがあればご教授お願いします。

まだアイデアというか実装方法を模索中なので、ソースコードはありませんがよろしくお願いします。

今回は環境はあまり関係ないかもしれませんが、開発環境はVC++ 2008 EEです。

Re:名前の入力画面

Posted: 2009年3月30日(月) 12:05
by yu
char moji[HEIGHT][WIDTH][2]={...};

で文字を格納して

2回for文で繰り返して座標を出せば....


簡単に考えたのですが、非効率ですかね;

Re:名前の入力画面

Posted: 2009年3月30日(月) 12:10
by Mist
私だったらテーブルにします。
typedef struct {
    int x;            // X座標
    int y;            // Y座標
    char h_mozi[3];   // ひらがな文字
    char k_mozi[3];   // カタカナ文字
} ST_MOZI;

const ST_MOZI mozitbl[/url] = {
    { 100, 100, "あ", "ア" },
    { 100, 120, "い", "イ" },
    ・
    ・
    { -1, -1, "", "" },  // テーブルエンド
};

ST_MOZI *ptbl;

for (ptbl = mozitbl; ptbl->x != -1; ptbl++) {
    if (今の座標と一致するか) {
         ;
    }
}

Re:名前の入力画面

Posted: 2009年3月30日(月) 13:21
by SooA
文字データを確保しておいて、

char	ndat1[5*11][/url] = { "あ","い","う","え","お", ..(略
char	ndat2[5*11][/url] = { "ア","イ","ウ", ..(略
char	ndat3[5*11][/url] = { "A","B","C", ..(略
// 名前5文字分
int	name_num[5][2] = { 0,0,0,0,0, 0,0,0,0,0 } ; // 0 で初期化しておく
char	name[16] = {""} ;


   0  1  2  3  4
0 あ い う え お
1 か き く け こ
2 さ し す せ そ
3 た ち つ て と
4 な に[ぬ]ね の
5 は ひ ふ へ ほ
6 ま み む め も
7 ら り る れ ろ
8 や ゆ よ わ を
9 ん ~ ー ゛ '
A ! ? $ &  

「ぬ」の部分にカーソルがあるとすると
 X=2,Y=4
// 修正変更する事を考慮して番号だけ記憶しておく
name_num[ 書き込み位置 ][0] = 種類 ; // 1 ひらがな/2 カタカナ/3 アルファベット
name_num[ 書き込み位置 ][1] = Y*5+X ;
// 最終決定で name_num から名前の文字列を作成する。
for( int i=0; i<5; i++ )
{
	if( name_num[0] == 1 )
		strcat( name, ndat1[ name_num[1] ] ) ;
	if( name_num[0] == 2 )
		strcat( name, ndat2[ name_num[1] ] ) ;
	if( name_num[0] == 3 )
		strcat( name, ndat3[ name_num[1] ] ) ;
}

後は応用で。

Re:名前の入力画面

Posted: 2009年3月30日(月) 15:01
by s-rush
yuさん、Mistさん、SooAさん、丁寧な解答ありがとうございます。
Mistさんのおっしゃるようにテーブル化したほうが後の管理がしやすそうですね。

最終的な名前の決定のやり方をSooAさんのソースを参考にして、
少しプログラムを書いてみます。

プログラムを書いているときに、わからないことが出てくるかもしれないので、
まだ解決ボタンは押さないでおきます。

Re:名前の入力画面

Posted: 2009年4月04日(土) 10:57
by s-rush
Mistさんのプログラムで少し疑問があります。
typedef struct {
    int x;            // X座標
    int y;            // Y座標
    char h_mozi[3];   // ひらがな文字
    char k_mozi[3];   // カタカナ文字
} ST_MOZI;
このh_mozi[3];は3バイト分ですよね?
ひらがなやカタカナって2バイトなので(←間違っていたらすいません
配列要素は2で充分だと思うのですが・・・
何か終端文字が付加されて配列要素は3になるのでしょうか?

いまこのあたりのプログラムを作っているのですが、
ここをちゃんと理解しないと名前入力部のプログラムができないので、
どなたかご教授お願いします。

Re:名前の入力画面

Posted: 2009年4月04日(土) 11:12
by yu
文字か文字列の違いですかね?
(プログラムを勉強しているわけではないのでしっかりしたことは言えないです;)

文字列だと最後に \0 がいるので3バイトだと思います。

唯の文字 を入れるの なら2バイトじゃないですか?

#すみません、間違っていました。orz

Re:名前の入力画面

Posted: 2009年4月04日(土) 11:31
by s-rush
文字をテーブルに入れて初期化しようとしているのですが、
配列の要素数を2にするとエラーが出ています。
初期化子が多いとかなんとか・・・

最後に\0が入っていると考えてもよろしいのでしょうか?

Re:名前の入力画面

Posted: 2009年4月04日(土) 11:46
by yu
あまり詳しいことは言えないのですが、

全角文字は1つの文字ではなく複数の文字を組み合わせて1つの全角文字を作っているらしいです。
だからその全角文字ひとつをそのまま文字として入れるのはできないと思います。
(間違っていたらすみません; というか間違っていそう・・・)

文字列で扱ったほうが良いと思います。

Re:名前の入力画面

Posted: 2009年4月04日(土) 12:00
by s-rush
分かりました。
yuさん、ご回答ありがとうございます^^

Re:名前の入力画面

Posted: 2009年4月04日(土) 13:39
by SooA
初期化部分で "" を使用して代入していますが
"" は文字列を表すので自動的に \0 が含まれ、
+1バイト必要になります。

■今回では必要ないと思いますが、
 今後の為に2バイトで制御する場合の
 データのあり方を書いておきます。

例えば「あ」を数値化すると 0x82 と 0xA0 ですので
h_mozi[0] = 0x82 ;
h_mozi[1] = 0xA0 ;
とすれば「あ」の情報自体は保持できます。
但し扱いは個々の数値とされるため文字列関数では使用できません。

下記のように文字列にしてから使うか、

char s[3] ;
s[0] = h_mozi[0] ;
s[1] = h_mozi[1] ;
s[2] = '\0' ;
strcpy( Name, s ) ;

Name に直接代入して \0 位置を制御する必要があります。

Re:名前の入力画面

Posted: 2009年4月04日(土) 14:58
by s-rush
SooAさん、ご丁寧にありがとうございます。
やっぱり、自動的に\0が含まれるのですね。

その点でエラーが出ていたので悩んでいたのですが、
おかげで解決することができました。

今は文字を選択する処理で悩んでいますが、
もう少し頑張ってみようと思います。

またお聞きするかと思いますが、その時はよろしくお願いします。