第一回:カーテンエフェクト
今日から、知ってるようで知ってる知識(知ってるんか!)を紹介していく微妙なコラムを始めてみます(´ω`)
第一弾、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);
}
イメージ的には「後ろが段々細くなってくマスク画像」をスライドさせていく、という感じです。
未処理、マスク、塗り潰しの三段構造ですね。