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 -