今回質問します内容はタイトルの通り、メニュー → ステージなどの切り替え持のフェードイン・フェードアウトをアルファブレンディングを利用して実行する関数を実装しようとしています。
過去スレにはすべて目を通し、前に同じような質問のスレを発見しましたが解決に至らないので質問させていただきます。
//【main_menu】
#include "../include/GV.h"
void menu_control(){
//選択制御
if(CheckStatePad(configpad.up) == 1){
menu.y -= 50;
menu.num--;
if(menu.y<0){
menu.y=100;
menu.num=2;
}
}
else if(CheckStatePad(configpad.down) == 1){
menu.y += 50;
menu.num++;
if(menu.y>100){
menu.y=0;
menu.num=0;
}
}
}
~略~
void menu_function(){
if( CheckStatePad(configpad.shot) == 1 ){
switch(menu.num)
{
case 0:
fade_flag=1;//フラグを立てる
change_scene();//フェード処理
func_state = 99; //ゲーム開始
break;
case 1:
func_state = 105; //クレジット表示
break;
case 2:
DxLib_End(); //ゲーム終了
break;
default:
printfDx("不明なメニューが選択されました ");
break;
}
}
}
void main_menu(){
menu_control();
menu_graph();
menu_function();
menu.cnt++;
}
//【effect.cpp】
~略~
//フェード処理実装中
void change_scene( ){
int c;
//fade_img = MakeGraph(640, 480); |この3行は関係なし
//GetDrawScreenGraph(0,0,640,480,fade_img); |
//DrawBox(0,0,640,480,color[0],TRUE); |
if(fade_flag==1){ //フラグが立っていたら
SetDrawScreen( DX_SCREEN_BACK ) ; //描写先を裏画面に設定
for(c=0; c<256;c++){
ClearDrawScreen(); // 裏画面のデータを全て削除
SetDrawBlendMode( DX_BLENDMODE_ALPHA, c ); //アルファブレンドを変更
DrawBox(0,0,640,480,color[1],TRUE); //640x480の黒い四角形を描写
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );//ブレンドモードを0に
ScreenFlip(); //裏画面を表画面に描写
}
for(c=0; c<256;c++){
ClearDrawScreen(); // 裏画面のデータを全て削除
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 255-c ); //アルファブレンドを変更
DrawBox(0,0,640,480,color[1],TRUE); //640x480の黒い四角形を描写
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );//ブレンドモードを0に
ScreenFlip(); //裏画面を表画面に描写
}
fade_flag=0; //フラグを0に戻す
}
}
メニュー画面で特定のアイコン選択時にzキーを押すとゲーム開始します。
画面が変わる前にfade_flagを立てchange_scene関数を呼び出します(引数を渡すかも検討中)
SetDrawBlendModeの使い方はDXライブラリー本家とここのサンプルプログラムで拝見しましたが、とりあえず「メニュー画面 → 白にフェードアウト → 白からフェードイン ゲーム画面」と動くように期待して書きましたが、メニューからゲーム画面に移行する間は真っ黒なままでした。
どのようにすれば上記のような動きを実現できるでしょうか。
よろしければ回答おねがいします。
【付け足し】
ScreenFlip()をメインループに書いた方がいいのは理解してますが、SetDrawBlendModeの把握のために二重にしてあります。
最終的にはメニューからゲーム画面にフェードインする際にキャラクターの移動も可能にしたいと思っています。メニュー画面のスクリーンショットを保存し、ゲーム画面とアルファブレンディングすればいけるかなと思っていますが、普通のフェードイン・アウトすらもできないのでここは追々(・ω・)
【環境】
処理系 :Microsoft Visual C++ 2010 Express
使用言語:C言語のみ
DXライブラリー使用