ページ 11

困ってます

Posted: 2012年6月25日(月) 16:28
by zakumen

コード:


#include "DxLib.h"

void setCurDirToExeDir(void) {
    char folder[1024];
    int i,j,len;
    GetModuleFileName(NULL,(CHAR*)folder,sizeof(folder));
    len=lstrlen(folder);
    j=len-1;
    for(i=0;i<len;i++) {
        if(folder[i] & 0x80)i++;
        else if(folder[i]=='\\')j=i;
    }
    folder[j]=0;
    SetCurrentDirectory(folder);
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{	
	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;	// エラーが起きたら直ちに終了
	}
	
	SetDrawScreen( DX_SCREEN_BACK );
	SetGraphMode(640,480,32);

	int MovieGraphHandle1 ;
	int MovieGraphHandle2 ;
	int MovieGraphHandle3 ;
	int MovieGraphHandle4 ;
	int MovieGraphHandle5 ;
	int MovieGraphHandle6 ;
	int MovieGraphHandle7 ;

	MovieGraphHandle1 = LoadGraph( "movie\\result.avi" ) ;
	MovieGraphHandle2 = LoadGraph( "movie\\0-50 clear.avi" ) ;
	MovieGraphHandle3 = LoadGraph( "movie\\51-70 clear.avi" ) ;
	MovieGraphHandle4 = LoadGraph( "movie\\71-99 clear.avi" ) ;
	MovieGraphHandle5 = LoadGraph( "movie\\out.avi" ) ;
	MovieGraphHandle6 = LoadGraph( "movie\\endmovie.avi" ) ;
	MovieGraphHandle7 = LoadGraph( "movie\\endmovie.avi" ) ; // 100~150の結果画面(予定)

	PlayMovieToGraph( MovieGraphHandle1 ) ;

	while( ProcessMessage() == 0 && GetMovieStateToGraph( MovieGraphHandle1 ) == 1 )
	{
		DrawExtendGraph( 0 , 0 , 640 , 480 , MovieGraphHandle1 , FALSE ) ;
		WaitTimer( 17 ) ;


	}



	
	  //ウィンドウモード変更と初期化と裏画面設定
	//WaitKey();	// キー入力待ち
	ChangeWindowMode(TRUE);

	int cr_w = GetColor( 255 , 255 , 255 ) ;// 白色の値を取得
	int push_flag = 0;
	int num = 0;
	int start_time;
	/*int MovieGraphHandle;*/
	
	start_time = GetNowCount();


	while (GetNowCount() - start_time < 10000)
	{
		if (ProcessMessage() == -1)
		{
			break;
		}
	

	if (push_flag == 1)
	{
		if ((CheckHitKey(KEY_INPUT_SPACE)) == 0)
		{
			push_flag = 0;
		}
	}

	if ((CheckHitKey(KEY_INPUT_SPACE)) == 1)
	{
		if (push_flag == 0)
		{
			push_flag = 1;
			num = num + 1;
		}
	}
	}

	DrawFormatString (5, 25 , GetColor(255, 255, 255), "結果:%d回", num);

	while( CheckHitKey( KEY_INPUT_SPACE ) == 0 )
	{
		// メッセージ処理
		if( ProcessMessage() == -1 )
		{
			 break ;	// エラーが発生したらループを抜ける
		}
	}
	
	

				
		
		if (num <= 9) //お手つきムービー
		{
			PlayMovieToGraph( MovieGraphHandle5 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle5 , FALSE ) ;
			}
		}

		else if (num <= 50) // 成功ムービー1
		{
			PlayMovieToGraph( MovieGraphHandle1 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle1 , FALSE ) ;
			}

			PlayMovieToGraph( MovieGraphHandle2 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle2 , FALSE ) ;
			}
		}

		else if (num <= 70) // 成功ムービー2
		{
			PlayMovieToGraph( MovieGraphHandle1 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle1 , FALSE ) ;
			}

			PlayMovieToGraph( MovieGraphHandle3 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle3 , FALSE ) ;
			}
		}

		else if (num <= 99) // 成功ムービー3
		{
			PlayMovieToGraph( MovieGraphHandle1 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle1 , FALSE ) ;
			}

			PlayMovieToGraph( MovieGraphHandle4 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle4 , FALSE ) ;
			}
		}

		else if (num <= 150) // 大成功ムービー
		{
			PlayMovieToGraph( MovieGraphHandle7 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle7 , FALSE ) ;
			}
		}

		
		

	PlayMovieToGraph( MovieGraphHandle7 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle7 , FALSE ) ;
			}
	
	
	
	ScreenFlip();
	// スペースキーの入力待ち
	while( CheckHitKey( KEY_INPUT_SPACE ) == 0 )
	{
		// メッセージ処理
		if( ProcessMessage() == -1 )
		{
			 break ;	// エラーが発生したらループを抜ける
		}
	}

	


	DxLib_End() ;		// DXライブラリ使用の終了処理

	return 0 ;		// ソフトの終了

}

このコードでデバックするのですが、ムービーが一切表示されません。設定なども見直したのですが間違ってないです。このコードにおかしなところがあれば教えてください。

Re: 困ってます

Posted: 2012年6月25日(月) 16:36
by h2so5
ScreenFlipがないようですが。

Re: 困ってます

Posted: 2012年6月25日(月) 16:48
by zakumen

コード:


#include "DxLib.h"

void setCurDirToExeDir(void) {
    char folder[1024];
    int i,j,len;
    GetModuleFileName(NULL,(CHAR*)folder,sizeof(folder));
    len=lstrlen(folder);
    j=len-1;
    for(i=0;i<len;i++) {
        if(folder[i] & 0x80)i++;
        else if(folder[i]=='\\')j=i;
    }
    folder[j]=0;
    SetCurrentDirectory(folder);
}

int WINAPI WinMain( HINSTANCE , HINSTANCE , LPSTR , int ){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
	
	if( DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;	// エラーが起きたら直ちに終了
	}
	
	SetDrawScreen( DX_SCREEN_BACK );
	SetGraphMode(640,480,32);

	int MovieGraphHandle1 ;
	int MovieGraphHandle2 ;
	int MovieGraphHandle3 ;
	int MovieGraphHandle4 ;
	int MovieGraphHandle5 ;
	int MovieGraphHandle6 ;
	int MovieGraphHandle7 ;

	MovieGraphHandle1 = LoadGraph( "movie\\result.avi" ) ;
	MovieGraphHandle2 = LoadGraph( "movie\\10-50 clear.avi" ) ;
	MovieGraphHandle3 = LoadGraph( "movie\\51-70 clear.avi" ) ;
	MovieGraphHandle4 = LoadGraph( "movie\\71-99 clear.avi" ) ;
	MovieGraphHandle5 = LoadGraph( "movie\\0-9 out.avi" ) ;
	MovieGraphHandle6 = LoadGraph( "movie\\endmovie.avi" ) ;
	MovieGraphHandle7 = LoadGraph( "movie\\endmovie.avi" ) ; // 100~150の結果画面(予定)

	PlayMovieToGraph( MovieGraphHandle1 ) ;

	while( ProcessMessage() == 0 && GetMovieStateToGraph( MovieGraphHandle1 ) == 1 )
	{
		DrawExtendGraph( 0 , 0 , 640 , 480 , MovieGraphHandle1 , FALSE ) ;
		WaitTimer( 17 ) ;


	}



	
	  //ウィンドウモード変更と初期化と裏画面設定
	//WaitKey();	// キー入力待ち
	ChangeWindowMode(TRUE);

	int cr_w = GetColor( 255 , 255 , 255 ) ;// 白色の値を取得
	int push_flag = 0;
	int num = 0;
	int start_time;
	/*int MovieGraphHandle;*/
	
	start_time = GetNowCount();


	while (GetNowCount() - start_time < 10000)
	{
		if (ProcessMessage() == -1)
		{
			break;
		}
	

	if (push_flag == 1)
	{
		if ((CheckHitKey(KEY_INPUT_SPACE)) == 0)
		{
			push_flag = 0;
		}
	}

	if ((CheckHitKey(KEY_INPUT_SPACE)) == 1)
	{
		if (push_flag == 0)
		{
			push_flag = 1;
			num = num + 1;
		}
	}
	}

	DrawFormatString (5, 25 , GetColor(255, 255, 255), "結果:%d回", num);

	while( CheckHitKey( KEY_INPUT_SPACE ) == 0 )
	{
		// メッセージ処理
		if( ProcessMessage() == -1 )
		{
			 break ;	// エラーが発生したらループを抜ける
		}
	}
					
		
		if (num <= 9) //お手つきムービー
		{
			PlayMovieToGraph( MovieGraphHandle5 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle5 , FALSE ) ;
			}
		}

		else if (num <= 50) // 成功ムービー1
		{
			PlayMovieToGraph( MovieGraphHandle1 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle1 , FALSE ) ;
			}

			PlayMovieToGraph( MovieGraphHandle2 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle2 , FALSE ) ;
			}
		}

		else if (num <= 70) // 成功ムービー2
		{
			PlayMovieToGraph( MovieGraphHandle1 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle1 , FALSE ) ;
			}

			PlayMovieToGraph( MovieGraphHandle3 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle3 , FALSE ) ;
			}
		}

		else if (num <= 99) // 成功ムービー3
		{
			PlayMovieToGraph( MovieGraphHandle1 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle1 , FALSE ) ;
			}

			PlayMovieToGraph( MovieGraphHandle4 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle4 , FALSE ) ;
			}
		}

		else if (num <= 150) // 大成功ムービー
		{
			PlayMovieToGraph( MovieGraphHandle7 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle7 , FALSE ) ;
			}
		}

		
		

	PlayMovieToGraph( MovieGraphHandle7 ) ;

			while( ProcessMessage() == 0 )
			{
				DrawGraph( 0 , 0 , MovieGraphHandle7 , FALSE ) ;
			}
	
	
	
	ScreenFlip();
	// スペースキーの入力待ち
	while( CheckHitKey( KEY_INPUT_SPACE ) == 0 )
	{
		// メッセージ処理
		if( ProcessMessage() == -1 )
		{
			 break ;	// エラーが発生したらループを抜ける
		}
	}

	


	DxLib_End() ;		// DXライブラリ使用の終了処理

	return 0 ;		// ソフトの終了

}

このようにしましたが、ムービーは出ませんでした。ほかに間違いがあればご指摘していただけると助かります。

Re: 困ってます

Posted: 2012年6月25日(月) 17:34
by softya(ソフト屋)
すごくシンプルにして、まず動画が再生できるようにして下さい。
あちこちにProcessMessage()などがあるのでまともに動くとは思えません。
ScreenFlip();とProcessMessage()はプログラム中に1箇所しか無い事が望ましいです。

【補足】
まず、ここを読んで下さい。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/h_11.html
上記サイトの 「不適切な実装2. WaitやSleepを行っている。」と「不適切な実装3. あちこちにDXライブラリ3大処理がある」に該当します。

Re: 困ってます

Posted: 2012年6月25日(月) 22:17
by ISLe
ムービーファイルがどこにあるかが問題なのでは?
setCurDirToExeDir関数に依存した場所にあるのに、setCurDirToExeDir関数を呼び出してないのが問題だったりとか。

どのようにデバッグしているかも不明です。