(http://homepage2.nifty.com/natupaji/DxL ... m.html#N19)を参考にして、
Talk.cppというファイルに同じようなプログラムをアレンジして書いてみたのですが、実行してみると
文字がしっかり1文字づつ表示されているのですが、次の文字が表示されるとすぐ消えてしまいます。
画面にしっかり文章を1文づつ表示させるにはどう直せば良いでしょうか。
Talk.cpp
#include "DxLib.h"
int FrameTime ; // 前回フレームでの経過時間
// サウンドノベル風文字列描画プログラム用データ群
// 文字のサイズ
#define MOJI_SIZE 24
int DrawPointX , DrawPointY ; // 文字列描画の位置
int SP , CP ; // 参照する文字列番号と文字列中の文字ポインタ
int TimeCounter1 ; // サウンドノベル風文字列描画処理用の時間計測用カウンタ変数
int EndFlag ; // 終了フラグ
int KeyWaitFlag ; // ボタン押し待ちフラグ
int OldTime , NowTime ;
char String[][ 256 ] =
{
" ゲームプログラムとは、いやプログラムとは" ,
"ある事柄を実現するプログラムの方法を説明されても理解できないことがある。B" ,
"@ なぜならそのプログラム技法も何かの基本的な技法の組み合わせで出来ているからだ。B",
"@ これはその他の学問も基本がわからないと応用が利かないということと同じ現象で、",
"別に特に珍しいことでもない。B" ,
"C しかしゲームプログラムとなると覚えなくてはならない基礎が沢山あり、" ,
"さらにある程度クオリティの高いソフトを作ろうとすると色々なプログラム技法を",
"習得しなくてはならない。B" ,
"@ しかもある程度レベルが高くなると自分で技法を編み出すか、技術レベルの高い",
"プログラマーに聞くなどするしか方法がなく大変厄介である。B"
"というかそのせいでゲームプログラムの敷居は高くなっているといえる。BE"
} ;
void StringShred( void ) ; // サウンドノベル風文字列描画プログラムの処理関数
void Kaigyou( void ) ; // サウンドノベル風文字列描画プログラムで使用する改行関数
void Talk_Initialize(){
// 描画位置の初期位置セット
DrawPointX = 0 ;
DrawPointY = 0 ;
// 参照文字位置をセット
SP = 0 ; // 1行目の
CP = 0 ; // 0文字
// フォントのサイズセット
SetFontSize( MOJI_SIZE ) ;
// 終了フラグを倒す
EndFlag = 0 ;
// 現在時間を初期化
NowTime = GetNowCount() ;
}
void Talk_Draw(){
// サウンドノベル風文字列描画処理を行う(画面右側のみ描画出きるようにする)
StringShred() ;
// 時間待ち
WaitTimer( 17 ) ;
// 今フレームでの経過時間を計測
OldTime = NowTime ;
NowTime = GetNowCount() ;
FrameTime = NowTime - OldTime ;
}
// サウンドノベル風文字列描画プログラムの処理関数
void StringShred( void )
{
char OneMojiBuf[ 3 ] ; // 1文字分一時記憶配列
// 時間計測用変数の値を1減らす
TimeCounter1 -- ;
// 時間計測用変数が0以上か、終了フラグが1だった場合は処理をしない
if( TimeCounter1 < 0 && EndFlag == 0 )
{
char Moji ;
// ボタン押し待ちフラグがたっていた場合はボタンが押されるまでここで終了
if( KeyWaitFlag == 1 )
{
if( CheckHitKeyAll() != 0 )
{
// ボタンが押されていたら解除
KeyWaitFlag = 0 ;
}
}
else
{
// 文字の描画
Moji = String[ SP ][ CP ] ;
switch( Moji )
{
case '@' : // 改行文字
// 改行処理および参照文字位置を一つ進める
Kaigyou() ;
CP ++ ;
break ;
case 'B' : // ボタン押し待ち文字
// ボタン押し待ちフラグをたてる
KeyWaitFlag = 1 ;
CP ++ ;
break ;
case 'E' : // 終了文字
// 終了フラグを立てるおよび参照文字位置を一つ進める
EndFlag = 1 ;
CP ++ ;
break ;
case 'C' : // クリア文字
// 画面を初期化して描画文字位置を初期位置に戻すおよび参照文字位置を一つ進める
DrawBox( 0 , 0 , 512 , 384 , 0 , TRUE ) ;
DrawPointY = 0 ;
DrawPointX = 0 ;
CP ++ ;
break ;
default : // その他の文字
// 1文字分抜き出す
OneMojiBuf[ 0 ] = String[ SP ][ CP ] ;
OneMojiBuf[ 1 ] = String[ SP ][ CP + 1 ] ;
OneMojiBuf[ 2 ] = '\0' ;
// 1文字描画
DrawString( 0 + DrawPointX * MOJI_SIZE , DrawPointY * MOJI_SIZE ,
OneMojiBuf , GetColor( 255 , 255 , 255 ) ) ;
// 参照文字位置を2バイト勧める
CP += 2 ;
// カーソルを一文字文進める
DrawPointX ++ ;
// 画面からはみ出たら改行する
if( DrawPointX * MOJI_SIZE + MOJI_SIZE > 512 ) Kaigyou() ;
break ;
}
// 参照文字列の終端まで行っていたら参照文字列を進める
if( String[ SP ][ CP ] == '\0' )
{
SP ++ ;
CP = 0 ;
}
}
// 時間計測用変数の値をセットする
TimeCounter1 = 2 ;
}
}
// 改行関数
void Kaigyou( void )
{
int TempGraph ;
// 描画行位置を一つ下げる
DrawPointY ++ ;
// 描画列を最初に戻す
DrawPointX = 0 ;
// もし画面からはみ出るなら画面をスクロールさせる
if( DrawPointY * MOJI_SIZE + MOJI_SIZE > 384 )
{
// テンポラリグラフィックの作成
TempGraph = MakeGraph( 0 , 384 ) ;
// 画面の内容を丸々コピーする
GetDrawScreenGraph( 0 , 0 , 512 , 384 , TempGraph ) ;
// 一行分上に貼り付ける
DrawGraph( 0 , -MOJI_SIZE ,TempGraph , FALSE ) ;
// 一番下の行の部分を黒で埋める
DrawBox( 0 , 384 - MOJI_SIZE , 512 , 384 , 0 , TRUE ) ;
// 描画行位置を一つあげる
DrawPointY -- ;
// グラフィックを削除する
DeleteGraph( TempGraph ) ;
}
}
#ifndef DEF_TALK_H //二重include防止
#define DEF_TALK_H
void StringShred( void ) ; // サウンドノベル風文字列描画プログラムの処理関数
void Kaigyou( void ) ; // サウンドノベル風文字列描画プログラムで使用する改行関数
void Talk_Initialize(); //初期化
void Talk_Draw(); //文章表示関数
#endif
#include "DxLib.h"
#include "FPlayer.h"
#include "Keyboard.h"
#include "FMap.h"
#include "Talk.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
SetMainWindowText("RPG");
ChangeWindowMode(TRUE);
SetGraphMode(512,384,32);
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
//ジョイパ使用
int GetJoypadInputState( int InputType );
InputCount_t InputCount;
FPlayer_t FPlayer;
ObjectData_t ObjectData;
FPlayer_Initialize( &FPlayer ); //Fプレイヤー初期化
FMap_Initialize( &ObjectData , &FPlayer );
Talk_Initialize(); //文章表示の初期化
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
Keyboard_Update(); //キーボード使用
Input_Count(&InputCount);//入力時間をカウントに
FPlayer_Calc( &FPlayer, &InputCount); //Fプレイヤー計算
FMAP_Object( FPlayer , ObjectData); //オブジェクト位置計算
FMap_Scroll( &FPlayer ); //Fマップスクロール
FMap_Draw(FPlayer); //Fマップ描画
Talk_Draw(); //文章を表示する
}
FPlayer_Finalize( FPlayer ); // 終了処理
DxLib_End();
return 0;
}