日別アーカイブ: 2010年12月11日

ゲーム開発37:フェードイン・フェードアウト

友人に更新が少ないって言われた>挨拶
---

画面切り替え時のフェードイン・フェードアウトを作成しました。これまでもあったんだけど、CGraphicsクラスに入れて全ゲームモードで使い回せるようにしました。

フェードのやり方は色々あると思うけど、俺は一番手前に画面全体を覆う白いスプライトを用意して、それの透過値を変えることで実現してます。

いちいち初期化するのも面倒なので、FadeMove()を呼んだらその中で初期化もループ動作も行ってます。例によって即値が入ってたり、無駄な処理があっても気にしない。

絵を描いたりボスキャラ組んだり、まだやることはたくさんあるな。

//—————————————————————————–
enum {
 FADE_IN,
 FADE_OUT,
 FADE_BLACK,
 FADE_WHITE
};

struct Fade {
 float cnt;  // 移動量
 float now;  // 現在の値
 int  color;  // 色
 int  spr_no;  // スプライトNo
 BOOL complete; // 完了フラグ
};

//—————————————————————————–
// フェード動作
// in_out:フェードインかフェードアウトか
// minutes:フェードする秒数
// color:切り替わる色
BOOL CGraphics::FadeMove(int in_out, float minutes, int color)
{
 RECT workRect;

 // 初期化
 if (fade.spr_no==-1) {
  // フェード用画像登録
  SetRect(&workRect, 0, 0, 47, 47);
  fade.spr_no=CreateSprite("data\graph\status.png", workRect);
  fade.now=1.0f;
  fade.complete=TRUE;
 }

 if (fade.complete) {
  // フェード開始
  if (in_out==FADE_OUT) {
   fade.cnt=1.0f/((float)minutes*60.0f);
   fade.now=0.0f;
  }
  else {
   fade.cnt=-1*(1.0f/((float)minutes*60.0f));
   fade.now=1.0f;
  }
  fade.color=color;
  fade.complete=FALSE;
 }
 else {
  // フェード中
  fade.now+=fade.cnt;
  if (fade.now>=1.0f && fade.cnt>0) {
   fade.now=1.0f;
   fade.complete=TRUE;
  }
  if (fade.now<=0.0f && fade.cntFadeMove(FADE_IN, 0.8f, FADE_WHITE)) {
 // フェード完了後の処理
 ………
}
// みたいにして置いておく