FadeOut
ただ単に,白っぽくなってるだけなので,絵は無いですが.
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); } } }