フェードアウト処理後画面が真っ暗なまま

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
John

フェードアウト処理後画面が真っ暗なまま

#1

投稿記事 by John » 14年前

龍神録のプロジェクトを用いてmain.cppにタイトル描画の処理を追加したのですが、フェードアウト処理の終了後メインプログラムの処理が始まるのですが画面が真っ暗なままです。
音楽は流れるのですが画面は真っ暗です。
自分で弾を撃ったり、必殺技(?)を使用したり、自分が消滅したり、敵が消滅したりするなど、新たな画像を描画する処理が入ると正常な画面が表示されます。
フェードアウト処理を無くし、フェードイン処理だけの場合は正常に動作しました。
環境はWindows7 VC++ 2008EEです。

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"
#include "../../../include/DxLib.h"

//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();  //現在のパッド入力処理を行う
	return 0;
}
	int i ;
	int GraphHandle ;
	char KeyBuf[ 256 ] ;

void title_in(){
	GraphHandle = LoadGraph( "../dat/img/title.png" ); // 画像を描画する
	SetDrawScreen( DX_SCREEN_BACK ) ;
	WaitTimer( 1000 ) ;

	for( i = 0 ; i < 255 ; i+=2 )	// フェードイン処理
	{
		SetDrawBright( i , i , i ) ; // 描画輝度をセット
		DrawGraph( 0 , 0 , GraphHandle , FALSE ) ; // グラフィックを描画
		ScreenFlip() ;
	}
}

void title(){
	LoadGraphScreen( 0 , 0 , "../dat/img/title_start.png" , TRUE ) ;// 画像を描画する
		if (CheckHitKey( KEY_INPUT_RETURN ))
			func_state=4;
}

void title_out(){
	GraphHandle = LoadGraph( "../dat/img/title.png" ); // 画像を描画する
	SetDrawScreen( DX_SCREEN_BACK ) ;
	WaitTimer( 0 ) ;
		
	for( i = 0 ; i < 255 ; i+=5 ) // フェードアウト処理
	{
		SetDrawBright( 255 - i , 255 - i , 255 - i ) ; // 描画輝度をセット
		DrawGraph( 0 , 0 , GraphHandle , FALSE ) ; 	  // グラフィックを描画
		ScreenFlip() ;
	}
}
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	if (SetGraphMode(800, 600, 32)==-1) {return -1;} // 画面解像度変更
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
	 GetHitKeyStateAll( KeyBuf ) ;                                    // すべてのキーの状態を得る
 
	while(ProcessLoop()==0){//メインループ
		music_ini();
		switch(func_state){
			case 0://初回のみ入る処理
				load();		//データロード
				first_ini();//初回の初期化
				func_state=1;
				break;
			case 1://STGを始める前に行う初期化
				ini();
				load_story();
				func_state=2;
				break;
			case 2:
				title_in();
				func_state=3;
				break;
			case 3:
				title();		
				break;
			case 4:
				title_out();
				func_state=100;
				break;
			case 100://通常処理
								 enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main();	 enter_func_tm("計算メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
		}
		music_play();			 enter_func_tm("音楽再生");
		fps_wait();				 enter_func_tm("待機した時間",1);
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
		count++;

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

jay
記事: 314
登録日時: 15年前
住所: 大阪市
連絡を取る:

Re: フェードアウト処理後画面が真っ暗なまま

#2

投稿記事 by jay » 14年前

う~ん…
この書き方だと呼び出されたtitle_out関数の中にあるループ処理の所為で、画面がフェードせずに一瞬で真っ暗になってしまうのではないでしょうか?
ついでにループの中で何度も同じ画像を描画しているのでCPUに無駄な負荷がかかると思います

title_out関数の中にループを入れるのではなくwhile(ProcessLoop()==0)のメインループでtitle_outが呼び出されるたびに少しずつ暗くしていくようにすればいいですよ
そして一定時間経過したら次の処理に進む、と言った具合ですね。
title_in関数も同様です(ただしこちらは当然ですが徐々に明るくすること)

そしてtitle_out関数でフェードアウトした後は、ゲームのメイン処理を開始する前にもう一度SetDrawBright関数を呼び出して画面の輝度をリセット(RGBを全て255に)してあげてください
画面の輝度が0のまま次に進んでいるので正常に画像が表示されないのだと思います。
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

John

Re: フェードアウト処理後画面が真っ暗なまま

#3

投稿記事 by John » 14年前

なるほど。そちらの書き方のが良さそうですね。
画面が真っ暗な問題はご指摘の通り輝度をリセットしてなかったからでした。
回答ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る