游戏开发

本类阅读TOP10

·初学者的福音:游戏开发新手入门指南
·《学VC、编游戏》重点算法解疑·快一点
·Windows的消息机制与消息重定向技术
·《学VC、编游戏》重点算法解疑·再快一点
·Rogue Guide
·《学VC、编游戏》重点算法解疑·狩猎谋生
·通向天才之路 : 把模块塞到动态连接库里去
·完成端口的深入理解及一种变态用法
·DirectX 9.0 SDK 开发包下载(April 2005)
·在OpenGL中实现多纹理混合(Multi-texture Blending)

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
用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位以上。



相关文章

相关软件