第一回:カーテンエフェクト

今日から、知ってるようで知ってる知識(知ってるんか!)を紹介していく微妙なコラムを始めてみます(´ω`)
第一弾、Advシステムでよくあるカーテンのようなエフェクトです。


void CTransBltter::CurtainBlt1(CSurface* pDst,CSurface* pSrc,BYTE nEffect,
    int nDstPosX,int nDstPosY,int nSrcPosX,int nSrcPosY,int nSizeX,int nSizeY)
{
    const int nPhase = nSizeX>>5;                        // 1フレームのドット数(基本フレーム数)
    const int nFrame = nSizeX/nPhase;                    // フレーム分割数
    const int nBegin = nEffect / (255/(nPhase+nFrame));  // 開始フレーム
    const int nPosX  = (nBegin-nPhase) * nPhase;         // 実際の開始位置

    // 基本フレームの描画
    for(int i=0; i<nPhase; ++i) {
        pDst->Blt(pSrc,
            nDstPosX+nPosX+(nPhase*i),nDstPosY,          // 位置は変わらず
            nSrcPosX+nPosX+(nPhase*i),nSrcPosY,
            nPhase-i,nSizeY);                            // 描画サイズだけ変わってく
    }

    // それ以前を塗り潰し
    pDst->Blt(pSrc,nDstPosX,nDstPosY,nSrcPosX,nSrcPosY,nPosX,nSizeY);
}

イメージ的には「後ろが段々細くなってくマスク画像」をスライドさせていく、という感じです。

未処理、マスク、塗り潰しの三段構造ですね。