このサンプルを参考に→http://homepage2.nifty.com/natupaji/DxL ... am.html#N6
文字列列挙方法を学んでいるのですが
#define MOJI_SIZE 24
// 仮想テキストバッファの横サイズ縦サイズ
#define STRBUF_WIDTH 24
#define STRBUF_HEIGHT 20
char StringBuf[ STRBUF_HEIGHT ][ STRBUF_WIDTH * 2 + 1 ] ;
int CursorX = 0 , CursorY = 0 ; // 仮想画面上での文字表示カーソルの位置
int SP , CP ;
char OneMojiBuf[ 3 ] ; // 1文字分一時記憶配列
ch[5][256]={
"プログラムを習得するに@は、実際に自分で書いてみることが大事。",
"参考書を読むことも重要だが、数学のように演習を通して、",
"体に身につけるようにしよう。",
"きっと、よりはっきりと、関数の使い方、",
"プログラムの書き方がわかるだろう。"
};
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
// 1文字分抜き出す
OneMojiBuf[ 0 ] = ch[ SP ][ CP ] ;
OneMojiBuf[ 1 ] = ch[ SP ][ CP + 1 ] ;
OneMojiBuf[ 2 ] = '\0' ;
StringBuf[ CursorY ][ CursorX] = OneMojiBuf[ 0 ] ;
StringBuf[ CursorY ][ CursorX+ 1 ] = OneMojiBuf[ 1 ] ;
// テキストバッファの描画
for( i = 0 ; i < STRBUF_HEIGHT ; i ++ )
{
DrawString( 8 , i * MOJI_SIZE , StringBuf[ i ] , GetColor( 255 , 255 , 255 ) ) ;
}
CP ++ ;
CursorX ++ ;
if(ch[ SP ][ CP ]=='\0') {
SP ++ ;CursorY++ ;CP=0 ;CursorX=0 ;}
}
上のように書いて"実際に自分で書いてみることが大事という"部分が一度描画されてその上から
次の文の"参考書を読むことも重要だが・・・"の文が描画され上書きされてしまいます。
改行後にも"参考書を読むことも重要だが・・・"という文が2回連続で来てしまいます
なぜこうなるのかご教授願います
文字列列挙で
Re: 文字列列挙で
http://homepage2.nifty.com/natupaji/DxL ... m.html#N20
↑のサンプルで
StringBuf[ CursorY ][ CursorX * 2 ] = OneMojiBuf[ 0 ] ;
StringBuf[ CursorY ][ CursorX * 2 + 1 ] = OneMojiBuf[ 1 ] ;
の* 2 を消すと文字化けして同じようなバグになります。
(ここでなぜ* 2 を付けるのかよくわかりません。付ける理由も教えて頂けたらと思います。)
↑のサンプルで
StringBuf[ CursorY ][ CursorX * 2 ] = OneMojiBuf[ 0 ] ;
StringBuf[ CursorY ][ CursorX * 2 + 1 ] = OneMojiBuf[ 1 ] ;
の* 2 を消すと文字化けして同じようなバグになります。
(ここでなぜ* 2 を付けるのかよくわかりません。付ける理由も教えて頂けたらと思います。)
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 文字列列挙で
> polpolさん
もう少し解りやすく書けばよかったですね、長文で解りにくかったと思います、すみません。
記事の分散を避けたい意図があったのですが、過去ログ変換には影響無いので書き込みして下さって大丈夫です。
もう少し解りやすく書けばよかったですね、長文で解りにくかったと思います、すみません。
記事の分散を避けたい意図があったのですが、過去ログ変換には影響無いので書き込みして下さって大丈夫です。
Re: 文字列列挙で
>という文が2回連続で来てしまいます
多分ここに載ってない部分で、SPをどこかでマイナスしてる。
そんなに長くなければ全掲載して下さいm(__)m
>(ここでなぜ* 2 を付けるのかよくわかりません。付ける理由も教えて頂けたらと思います。)
英数字は1文字1バイト、日本語は1文字2バイトだからです。上半身と下半身で一つの人間なのに、別々で扱ったら二目と見れない姿(文字化け)になるということです。
多分ここに載ってない部分で、SPをどこかでマイナスしてる。
そんなに長くなければ全掲載して下さいm(__)m
>(ここでなぜ* 2 を付けるのかよくわかりません。付ける理由も教えて頂けたらと思います。)
英数字は1文字1バイト、日本語は1文字2バイトだからです。上半身と下半身で一つの人間なのに、別々で扱ったら二目と見れない姿(文字化け)になるということです。
Re: 文字列列挙で
ゆーずいさん返答ありがとうございます。
どうやらSTRBUF_WIDTHの初期値が短かったらしく、STRBUF_WIDTH 24→240
とすれば直りました。
>英数字は1文字1バイト、日本語は1文字2バイトだからです
なるほど。英数字が入れば*2としないと文字化けするんですね。
2通りで場合分けしないといけないようですね
勉強になりました。解決しました
ありがとうございます。
どうやらSTRBUF_WIDTHの初期値が短かったらしく、STRBUF_WIDTH 24→240
とすれば直りました。
>英数字は1文字1バイト、日本語は1文字2バイトだからです
なるほど。英数字が入れば*2としないと文字化けするんですね。
2通りで場合分けしないといけないようですね
勉強になりました。解決しました
ありがとうございます。