ページ 11

ノベルの文字が表示されない

Posted: 2011年6月04日(土) 18:03
by 朧鴉
シューティングゲームにノベルを入れたんですけど、どんなに頑張っても文字が表示されません。
誰か教えてください!!

コード:

//main.cpp
#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    GetHitPadStateAll();  //現在のパッド入力処理を行う
	GetCheckHitKeyAll_2(&MD.AllKeyCount);//	全キーの押下カウント
    return 0;
}
void StateChange(GameState_t State){
	MD.beforeState=MD.gameState;
	MD.gameState=State;
}
void Title()
{
    DrawString( 32, 160,GAME_TITLE_STR,GetColor(255,255,255) );

	//	HIT ANY KEY
	DrawString( 20, 240,"HIT ANY KEY",GetColor(155,155,255) );
	
	//	何かキーが押された?
	if( MD.AllKeyCount== 1 ) {
		StateChange(GAME_STATE_LOAD);
	}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
	SetMainWindowText(GAME_TITLE_STR);//タイトル
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	first_ini();//初回の初期化

    while(ProcessLoop()==0){//メインループ
		music_ini();
		switch(MD.gameState){
			case GAME_STATE_TITLE:
				Title();
				break;
            case GAME_STATE_LOAD://初回のみ入る処理
				load();         //データロード
				StateChange(GAME_STATE_NOVEL_INI);
                break;
            case GAME_STATE_INI://STGを始める前に行う初期化
                ini();
				load_story();
				MD.gameState=GAME_STATE_MAIN;
                break;
            case GAME_STATE_MAIN://通常処理
                calc_ch();   //キャラクタ計算
                ch_move();   //キャラクタの移動制御
                cshot_main();//自機ショットメイン
				enemy_main();//敵処理メイン
				shot_main(); //ショットメイン
				boss_shot_main();
				out_main();  //当たり計算
				effect_main();//エフェクトメイン
                graph_main();//描画メイン
				if(boss.flag==0)
	                stage_count++;
                break;
			case GAME_STATE_NOVEL_INI:
				novel_ini();
				MD.gameState=GAME_STATE_NOVEL;
				break;
			case GAME_STATE_NOVEL:
				novel_main();
				if(novel.EndFlag==1){
					if(MD.beforeState==GAME_STATE_LOAD)StateChange(GAME_STATE_INI);
				}
				break;
            default:
                printfDx("不明なfunc_state\n");
                break;
        }
		music_play();
        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
		count++;
    }

    DxLib_End();//DXライブラリ終了処理
    return 0;
}

コード:

//novel.cpp
 #include "../include/GV.h"
#include <math.h>

char String[100][256];
char StringBuf[STRBUF_HEIGHT][STRBUF_WIDTH*2+1] ;	// 仮想テキストバッファ
int CursorX,CursorY;						// 仮想画面上での文字表示カーソルの位置
int SP,CP;							// 参照する文字列番号と文字列中の文字ポインタ
int KeyWaitFlag;						// ボタン押し待ちフラグ
int Count;							// フレームカウンタ

	 //テキスト読み込みの関数
	void load_Text();
void novel_ini(){
	//テキストの読み込み
	load_Text();
		// フォントのサイズセット
	SetFontSize( MOJI_SIZE );
	// 描画位置の初期位置セット
	CursorX = 0 ;
	CursorY = 0 ;
	// フレームカウンタ初期化
	Count = 0 ;
	// 参照文字位置をセット
	SP = 0 ;	// 1行目の
	CP = 0 ;	// 0文字
}

void load_Text(){
	char fname[32]={"0.txt"};           //テキストファイルの場所
	int fp;    //ファイルポインタ
    char input; //仮テキスト格納
	// 参照文字位置をセット
	SP = 0 ;	// 1行目の
	CP = 0 ;	// 0文字

	fp = FileRead_open(fname);//ファイル読み込み
	if(fp == NULL){
		printfDx("read error\n");
		return;
	}
	while(1){
	    input=FileRead_getc(fp);//1文字取得する
		if(input==EOF)break;
		if(input!='\r'){
			String[SP][CP]=input;
			CP++;
		}
		else{
			CP=0;
			SP++;
		}		
	}
}
	void novel_main(){
		char OneMojiBuf[ 3 ];	// 1文字分一時記憶配列
		int i,j;
		if( MD.EndFlag == 0 )
		{
			char  Moji;

			// ボタン押し待ちフラグがたっていた場合はボタンが押されるまでここで終了
			if( KeyWaitFlag == 1 )
				if(CheckHitKeyAll() != 0 )KeyWaitFlag = 0;// ボタンが押されていたら解除
			else
			{
				// 文字の描画
				Moji = String[ SP ][ CP ] ;
				switch( Moji )
				{
				case '\n':	// 改行文字
					// 改行処理および参照文字位置を一つ進める
					Kaigyou() ;
					CP++;
					break ;
				case 'B' :	// ボタン押し待ち文字
					// ボタンが離されるまで待つ
					while( ProcessMessage() == 0 && CheckHitKeyAll() != 0 ){}
					// ボタン押し待ちフラグをたてる
					KeyWaitFlag = 1 ;
					CP ++ ;
					break ;
				case 'E' :	// 終了文字
					// 終了フラグを立てるおよび参照文字位置を一つ進める
					MD.EndFlag = 1 ;
					CP ++ ;
					break ;
				case 'C' :	// クリア文字
					// 仮想テキストバッファを初期化して描画文字位置を初期位置に戻すおよび参照文字位置を一つ進める
					for( i = 0 ; i < STRBUF_HEIGHT ; i ++ )
						for( j = 0 ; j < STRBUF_WIDTH * 2 ; j ++ )
							StringBuf[ i ][ j ] = 0;

					CursorY = 0 ;
					CursorX = 0 ;
					CP ++ ;
					break ;
				default :	// その他の文字
					// 1文字分抜き出す
					OneMojiBuf[ 0 ] = String[ SP ][ CP ] ;
					OneMojiBuf[ 1 ] = String[ SP ][ CP + 1 ] ;
					OneMojiBuf[ 2 ] ='\0';

					// 1文字テキストバッファに代入
					StringBuf[ CursorY ][ CursorX * 2 ] = OneMojiBuf[ 0 ] ;
					StringBuf[ CursorY ][ CursorX * 2 + 1 ] = OneMojiBuf[ 1 ] ;

					// 参照文字位置を2バイト勧める
					CP += 2 ;

					// カーソルを一文字文進める
					CursorX ++ ;

					// テキストバッファ横幅からはみ出たら改行する
					if( CursorX >= STRBUF_WIDTH ) Kaigyou() ;
					break ;
				}
				// 参照文字列の終端まで行っていたら参照文字列を進める
				if(String[ SP ][ CP ] == '\0' )
				{
					SP ++ ;
					CP = 0 ;
				}
			}
		}
		// 背景エフェクトの描画
		{
			int Color ;

			Color = ( int )( sin(Count/ 100.0 ) * 80.0 + 125.0 ) ;
			DrawBox( 0 , 0 , 640 , 480 , GetColor( Color , 0 , 0 ) , TRUE ) ;
			Count ++ ;
		}
		// テキストバッファの描画
		for( i = 0 ; i < STRBUF_HEIGHT ; i ++ )
		{
			DrawString( 8 , i * MOJI_SIZE , StringBuf[ i ] , GetColor( 255 , 255 , 255 ) ) ;
		}
	}
// 改行関数
void Kaigyou( void )
{
	// 描画行位置を一つ下げる
	CursorY ++ ;

	// 描画列を最初に戻す
	CursorX = 0 ;

	// もしテキストバッファ縦幅からはみ出るならテキストバッファを縦スクロールさせる
	if( CursorY >= STRBUF_HEIGHT )
	{
		int i , j ;

		for( i = 1 ; i < STRBUF_HEIGHT ; i ++ )
		{
			for( j = 0 ; j < STRBUF_WIDTH * 2 ; j ++ )
			{
				StringBuf[ i - 1 ][ j ] = StringBuf[ i ][ j ] ;
			}
		}

		// 描画行位置を一つあげる
		CursorY -- ;
	}
}

Re: ノベルの文字が表示されない

Posted: 2011年6月04日(土) 19:30
by みけCAT
これだけではわかりにくいです。
プロジェクト全体があるとありがたいです。(とりあえず特にgraph_main関数が知りたいです)
文字の描画の関数はどこですか?

Re: ノベルの文字が表示されない

Posted: 2011年6月04日(土) 19:35
by 朧鴉
文字の描写はnovel.cppの137行目にあると思います。

Re: ノベルの文字が表示されない

Posted: 2011年6月04日(土) 19:52
by みけCAT
novel_main関数をちゃんと呼んでいますか?

Re: ノベルの文字が表示されない

Posted: 2011年6月04日(土) 20:48
by 朧鴉
ノベルの背景はしっかりでるのでnovel_mainはしっかりできているとおもいます。
ただ文字だけが表示されないだけで

Re: ノベルの文字が表示されない

Posted: 2011年6月04日(土) 20:58
by box
本筋とは関係ないと思いますが…。
朧鴉 さんが書きました:

コード:

void load_Text(){
	int fp;    //ファイルポインタ
fp の型は int で間違いないですか?間違いないとすると
朧鴉 さんが書きました:

コード:

	if(fp == NULL){
NULL と比較するのはおかしいです。