フェードイン、フェードアウトの作り方
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 ; // ソフトの終了
}