フェードイン、フェードアウトの作り方
Posted: 2009年8月28日(金) 17:24
ゲームプログラミングの館を見て実装しようとしたのですが、うまくいきませんでした。
どのように実装すればいいのでしょうか?ゲームに応用するのができません。
とくに選択画面で選択したときにどうすればいいのでしょう?
どのように実装すればいいのでしょうか?ゲームに応用するのができません。
とくに選択画面で選択したときにどうすればいいのでしょう?
switch(choose_y){ case 80: if( CheckSoundMem( bgm[5] ) == 1 ) StopSoundMem( bgm[5] ) ; if( CheckSoundMem( sound_effect[6] ) == 0 ) PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ; main_flag=2; if(stage_flag!=1) stage_flag=1; break; ...省略 }としているのですが、この選んでからゲームが始まるまでに(main_flag=2になるまでに)フェードインなどをしたいのです。
// フェードイン処理 for(int i = 0 ; i < 256 ; i++ ) { // 描画輝度をセット SetDrawBright( 255 - i , 255 - i , 255 - i ) ; if(i==255){ if( CheckSoundMem( sound_effect[6] ) == 0 ) PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ; WaitTimer( 200 ) ;//0.2秒待つ main_flag=2; player.easy_flag=0; player.hard_flag=0; if(stage_flag!=4) stage_flag=4; } }としたのですが、なぜか失敗してしまいます。
#include "DxLib.h" #include "Extern.h" void Title_Draw(){ if(bgm_select_flag!=0 ||stage_flag!=0){ stage_flag=0; bgm_select_flag=0; } DrawGraph( 0 , 0 , title_img , FALSE ); DrawStringToHandle( 20 , 420 , "タイトル" , white , font[2] ); DrawStringToHandle( 460 , 420 , "Ver 1.00 (test) " , white , font[3] ); DrawGraph( 50 , 100 , title_d_img[0] , TRUE ); DrawGraph( 50 , 156 , title_d_img[2] , TRUE ); DrawGraph( 50 , 212 , title_d_img[1] , TRUE ); DrawGraph( 10 , title_y+16 , title_d_img[3] , TRUE ); //上キー if( CheckHitKey( KEY_INPUT_UP ) == 1 && t_count%5==0 ){ if( CheckSoundMem( sound_effect[0] ) == 0 ) PlaySoundMem( sound_effect[0] , DX_PLAYTYPE_BACK ) ; if(title_y>100){ if(title_y==212&&clear_flag==0) title_y-=112; else title_y-=56; } } //下キー if( CheckHitKey( KEY_INPUT_DOWN ) == 1 && t_count%5==0 ){ if( CheckSoundMem( sound_effect[0] ) == 0 ) PlaySoundMem( sound_effect[0] , DX_PLAYTYPE_BACK ) ; if(title_y<212){ if(title_y==100&&clear_flag==0) title_y+=112; else title_y+=56; } } //escapeキー if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1){ if( CheckSoundMem( sound_effect[0] ) == 0 ) PlaySoundMem( sound_effect[0] , DX_PLAYTYPE_BACK ) ; if(title_y!=212) title_y=212; } if( CheckHitKey( KEY_INPUT_Z ) == 1 || CheckHitKey( KEY_INPUT_RETURN ) == 1 ){ switch(title_y){ case 100: if( CheckSoundMem( sound_effect[6] ) == 0 ) PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ; WaitTimer( 200 ) ;//0.2秒待つ main_flag=1; break; case 156: if( CheckSoundMem( bgm[5] ) == 1 ) StopSoundMem( bgm[5] ) ; if( CheckSoundMem( sound_effect[6] ) == 0 ) PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ; WaitTimer( 200 ) ;//0.2秒待つ main_flag=2; player.easy_flag=0; player.hard_flag=0; if(stage_flag!=4) stage_flag=4; break; case 212: if( CheckSoundMem( sound_effect[6] ) == 0 ) PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ; DxLib_End(); //終了 break; default: break; } } }となっていますが、
switch(title_y){ case 100: if( CheckSoundMem( sound_effect[6] ) == 0 ) PlaySoundMem( sound_effect[6] , DX_PLAYTYPE_BACK ) ; for(int i=0;i<256;i+=4){ // 描画輝度をセット SetDrawBright( 255 - i , 255 - i , 255 - i ) ; DrawGraph( 0 , 0 , title_img , FALSE ); ScreenFlip() ; } for(int i=0;i<256;i++){ // 描画輝度をセット SetDrawBright( i , i , i ) ; DrawGraph( 0 , 0 , title_img , FALSE ); ScreenFlip() ; if(i==255){ main_flag=1; } } break;とすることにより実装できましたが考え的には、
// フェードイン処理 int FadeIn( int Color , int Speed ){ for(int i = 0 ; i < 255 ; i += Speed ){ // 描画輝度をセット SetDrawBright( i , i , i ) ; // グラフィックを描画 DrawBox( 0 , 0 , 640 , 480 , Color , true ) ; if(i < 255) return true; } return false; } // フェードアウト処理 int FadeOut( int Color , int Speed ){ for(int i = 0 ; i < 255 ; += Speed ){ // 描画輝度をセット SetDrawBright( 255 - i , 255 - i , 255 - i ) ; // グラフィックを描画 DrawBox( 0 , 0 , 640 , 480 , Color , true ) ; if(i < 255) return true; } return false; } if(CheckHitKey(KEY_INPUT_B)){ FadeIn(RGB(0,0,0),1); } if(CheckHitKey(KEY_INPUT_A)){ FadeOut(RGB(0,0,0),1); }
// フェードイン処理 bool FadeIn( int Color , int Speed ){ for(int i = 0 ; i < 255 ; i += Speed ){ // 描画輝度をセット SetDrawBright( i , i , i ) ; // グラフィックを描画 DrawBox( 0 , 0 , 640 , 480 , Color , true ) ; // ScreenFlip(); if(i < 255) return true; } return false; } // フェードアウト処理 bool FadeOut( int Color , int Speed ){ for(int i = 0 ; i < 255 ; i += Speed){ // 描画輝度をセット SetDrawBright( 255 - i , 255 - i , 255 - i ) ; // グラフィックを描画 DrawBox( 0 , 0 , 640 , 480 , Color , true ) ; // ScreenFlip(); if(i < 255) return true; } return false; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ ChangeWindowMode(true); // ウインドウの変更 フルスクリーン・ウインドウ SetDrawScreen( DX_SCREEN_BACK ) ; // 描画先を裏画面に設定 // DXライブラリ初期化処理 if( DxLib_Init() == -1 ){ return -1; // エラーが起きたら直ちに終了 } // 処理 while(1){ // BMP画像の表示 ClearDrawScreen(); if(CheckHitKey(KEY_INPUT_B)){ FadeIn(RGB(0,0,0),1); } if(CheckHitKey(KEY_INPUT_A)){ FadeOut(RGB(0,0,0),1); } ScreenFlip(); // 処理の終了 if(CheckHitKey(KEY_INPUT_ESCAPE)) break; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }