s2. サウンドノベル風文字列表示法1
ノベルゲームやアドベンチャーゲーム、同人ゲームなどのセリフの表示は、目で追いやすいように、時間差で
表示されていますね。あれを作ってみましょう。まずは、簡単なプログラムから行きます。
あらかじめ、表示する文章を作っておき、実際に画面に表示するための文字列を格納する変数を別につくり、
時間差で、あらかじめ作ってある文字列から、現在文字列を表示する変数に順々にコピーしながら表示すると
よいでしょう。
今回は、s0節で説明した、「たった今入力された」を判定する で紹介したプログラムを使って、エンターを押したかどうか判定します。
時間の測定にはcounter変数を用いています。処理が1周するたびに、counterの値を増やします。
counterの値が5の倍数の時に、処理を進めることで、5周に1度処理をすることが出来ます。
サンプルプログラムでは
i が「文章の各文字までのバイト数」を表します。
つまり i が4なら4バイト目まで、全角2文字までを格納することになります。
i が4の時、最初の4バイト、全角2文字を格納し、[4]='\0'する事で、その配列を文字列として表示できます。
このiを2ずつ増やしていくことで、全角1文字ずつ表示する文字列を増やすことが出来ます。
ch_iは各文章の番号です。ch_iが1つ進むと、次の文章になります。
宣言がch[5][80]で宣言されています。実際に扱うとき、ch[ch_i][i]で扱っていくことになります。
dispは、その現在表示すべき文字列のコピー先配列です。
chは全ての文字列のデータです。
#include "DxLib.h" int i=0,j,ch_i=0,counter=0,White; char Key[256],oldKey[256]={},disp[80]="",ch[5][80]={ "プログラムを習得するには、実際に自分で書いてみることが大事。", "参考書を読むことも重要だが、数学のように演習を通して、", "体に身につけるようにしよう。", "きっと、よりはっきりと、関数の使い方、", "プログラムの書き方がわかるだろう。" }; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ) ; White=GetColor(255,255,255); while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){ for(j=0;j<256;j++){ if(oldKey[j]==0 && Key[j]==1) Key[j]=2; oldKey[j]=Key[j]; } if(Key[KEY_INPUT_RETURN]==2){ // 前回押されてなくて、今回押されていたら i=0; // iを初期値に戻し ch_i++; // 表示する配列を1つずらす if(ch_i==5) // これ以上表示する配列がなくなったらbreak; break; } // 配列の終端-2以下で、今回コピーするiまでの配列要素のi番目が\0じゃなくカウンターが5の倍数なら if(i<=80-2 && ch[ch_i][i]!='\0' && counter%5==0){ i+=2; // 全角文字なので配列要素2つずつカウントアップ strncpy(disp,ch[ch_i],i);// iバイトまでの配列要素をdisp配列にコピー disp[i]='\0'; // 終端記号を代入 } DrawFormatString(10,420,White,"%s",disp);//disp配列の文字データを表示 counter++; ScreenFlip() ; } DxLib_End() ; return 0 ; }
実行画面
- Remical Soft -