読者です 読者をやめる 読者になる 読者になる

FadeOut

OpenGL フリーゲーム作製


ただ単に,白っぽくなってるだけなので,絵は無いですが.


30分位で FadeOut スクリプトコマンド実装完了.

screen.FadeOut Color, term, bFullScreen    // FadeOut;色,時間,全面か?
screen.FadeIn  Color, term, bFullScreen    // FadeIn;色,時間,全面か?


GL_DEPTH_TEST を切って,全画面を覆うglRect()をアルファブレンドするだけ.
非常に簡単なのに,ものすごく効果的.
場面のつなぎ目をFadeOut→FadeInとするだけで,かなり,ソレっぽくなる.
うーん,全てがこんな簡単に行くと楽なんだけどね.

※一部を抜粋
class CScreenManager
{
// メンバ変数
  static float    m_fFadeT;           // Fade In/Out のパラメータ変数
  static float    m_fFadeDT;          // Fade In/Out のパラメータ変数増減値
  static CVector  m_vcFadeColor;      // Fade In/Out の色
  static bool     m_bFadeFullScreen;  // 全面Fadeか?

// スクリプトからのコールバック
  // screen.FadeOut Color, term, bFullScreen
  static bool Cmd_FadeOut(CCommand* &ptr, IInstance *pInst)
  {
    m_vcFadeColor.SetDWORD(ptr->dwValueID);
    m_fFadeDT = (ptr->fParam[0] == 0.0f) ? 0.0f : 1.0f/ptr->fParam[0];
    m_bFadeFullScreen = (ptr->fParam[1] != 0.0f);
    return true;
  }
    
  // screen.FadeIn Color, term, bFullScreen
  static bool Cmd_FadeIn(CCommand* &ptr, IInstance *pInst)
  {
    m_vcFadeColor.SetDWORD(ptr->dwValueID);
    m_fFadeDT = (ptr->fParam[0] == 0.0f) ? 0.0f : -1.0f/ptr->fParam[0];
    m_bFadeFullScreen = (ptr->fParam[1] != 0.0f);
    return true;
  }

// FadeIn/Out
  // FadeIn/Out実行(1フレーム毎に呼び出す)
  void RunFade()
  {
    // m_fFadeDT != 0 なら,フェード中
    if (m_fFadeDT != 0.0f) {
      m_fFadeT += m_fFadeDT;
      if (m_fFadeT > 1.0f) {
        m_fFadeT = 1.0f;
        m_fFadeDT = 0.0f;
      } else 
      if (m_fFadeT < 0.0f) {
        m_fFadeT = 0.0f;
        m_fFadeDT = 0.0f;
      }
    }
  }

  // FadeIn/Out描画(描画毎に呼び出される)
  void DrawFade()
  {
    if (m_fFadeT == 0.0f) return;

    GL::SetAlphaBlend();
    m_vcFadeColor.a = m_fFadeT;

    if (m_bFadeFullScreen) {
      // 全画面フェード
      m_iFlipCount = 0;               // Fade中は全面書き換え
      glColor4fv(m_vcFadeColor);
      glRectf(0, 0, 640, 480);
      CSDLCore::GLEndScreenView();    // PersViewに戻す
    } else {
      // メイン画面だけフェード
      CSDLCore::GLEndScreenView();    // PersViewに戻す
      VECTOR2D vcFade(m_vcScreenWidth.x*0.5f, m_vcScreenWidth.y*0.5f);
      glColor4fv(m_vcFadeColor);
      glRectf(-vcFade.x, -vcFade.y, vcFade.x, vcFade.y);
    }
  }
}