|
|
用Gamma控制来实现FadeIn和FadeOut |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
DirectX中提供了一个Gamma控制(从 5.0 开始的吗),利用它可方便的完成FadeIn、FadeOut的功能,而且不 需改动Surface的内容, 基本上不存在速度的问题。我这人特懒,打字也慢(真想有个秘书小姐,我说她打那就爽 了)我就简单的写点。 代码如下:(我已测试过)
// declare for gamma fadeout and fadein // global var LPDIRECTDRAWGAMMACONTROL lpDDGammaControl = NULL; DDGAMMARAMP DDGammaRamp; DDGAMMARAMP DDGammaOld;
// assume u have succeed create u main surface // LPDIRECTDRAWSURFACE lpDDSPrimary = NULL; // lpDDSPrimary point to u main surface //------------------Get gamma control (void **)&lpDDGammaControl); //------------------------------------------------------
// this is fadeout and fadein function void gfx_GammaFadeOut() { int nIndex; int nIndex0;
if( lpDDGammaControl == NULL ) return;
lpDDGammaControl->GetGammaRamp(0, &DDGammaOld); lpDDGammaControl->GetGammaRamp(0, &DDGammaRamp);
// Fade Out for( nIndex0 = 256; nIndex0 >0; nIndex0 -= 4) { for( nIndex=0; nIndex < 256; nIndex++) { DDGammaRamp.red[nIndex] = DDGammaOld.red[nIndex]*nIndex0/256; DDGammaRamp.blue[nIndex] =DDGammaOld.blue[nIndex]*nIndex0/256; DDGammaRamp.green[nIndex] =DDGammaOld.green[nIndex]*nIndex0/256; } lpDDGammaControl->SetGammaRamp(0 , &DDGammaRamp); } //end for( nIndex=0; nIndex < 256; nIndex++) { DDGammaRamp.red[nIndex] =DDGammaOld.red[nIndex]*nIndex0/256; DDGammaRamp.blue[nIndex] =DDGammaOld.blue[nIndex]*nIndex0/256; DDGammaRamp.green[nIndex] =DDGammaOld.green[nIndex]*nIndex0/256; } lpDDGammaControl->SetGammaRamp(0 , &DDGammaRamp); } //end for } 代码还有点漏洞,就是你必须先调用DirectDraw对象的GetCaps函数以确认你的显卡支持Gamma Control想偷懒 就看看DxSdk 的 DirectX Device Viewer 工具。灵活的使用Gamma control还可以实现一些其他功能,我就不瞎扯 了。它的缺点是:没有软件模拟,只能在全屏下干活,主surface的位深度必须是16位以上。

|
|
相关文章:相关软件: |
|