使用DirectDraw的Gamma控制形成淡出效果

2016-02-19 17:11 6 1 收藏

下面图老师小编跟大家分享一个简单易学的使用DirectDraw的Gamma控制形成淡出效果教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】

  为什么要使用DDRAW中的Gamma控制功能来做淡出呢?有两个主要原因:第一个是因为简单;第二是因为使用Gamma淡出,你不会丢失任何存储在主表面中的信息。

  既然这样,在实现这种技术之前,有些不显眼的小事情我们必须给予注意。首先,你的主表面必须是16Bit色或更高;第二个是这种淡出只能在你的主表面上来做,因为这是在调整你的显卡的gamma设置。

  让我们认真考虑一下:在DirectDraw库中包含一个结构DDGAMMARAMP。这个结构由3个包含256个字的数组组成,分别是Red,Green和Blue。例如:

  

typedef struct DDGAMMARAMP{  WORD red[256];  WORD green[256];  WORD blue[256];}DDGAMMARAMP,FAR *LPDDGRAMMARAMP;

  这个结构保存着我们的显示卡当前的Gamma设定值。那么,来声明几个我们程序中使用的变量。

  //初始化Gamma控制以便应用

  LPDIRECTDRAWGAMMACONTROL lpDDGammaControl = NULL;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  //这个是我们将修改的斜坡值(ramp)

  DDGAMMARAMP DDGammaRamp;

  //这个结构用来保存原来的gamma值,以便淡出完成后恢复我们gamma值

  DDGAMMARAMP DDGammaOld;

  完成了这些之后我们需要查明显示是否支持gamma控制(尽管如果显卡硬件不支持它的话,DX将会用软件模拟它),所以来查询主表面:

  lpddsprimary-QueryInterface(IID_IDirectDrawGammaControl,(void **)& lpDDGammaControl);

  然后看显卡当前的gamma设置是否正确,再存储它到DDGAMMAOLD结构里

  lpDDGammaControl-GetGammaRamp(0,&DDGammaOld);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  让我们来做一下这个,并且保存值到DDGAMMARAMP结构里,以便我们修改它的值:

  lpDDGammaControl-GetGammaRamp(0,&DDGammaRamp);

  现在除非一个用户改变他们计算机上的GAMMA设定值,应当把你的DDGammaRamp结构的值增加到第256个。现在,因为每个Red,Green和Blue的值可以是任何0到65535的值,我们不想把它们值改到1。所以,我决定写下尽可能快的代码把所有的256的值到0然后每次刷新屏幕。下面是代码实现:(这里有些说不明白,附原文:

Now unless a user changes the values of the gamma on their computer the values should go up as you reach the 256th value in your DDGammaRamp structure. Now because each value of Red, Blue and Green can be anywhere from 0 to 65535 we wouldn't want to decrement our values by 1. Instead I decided to make the code as fast as possible so I set all 256 values to 0 and update the screen after each. Here is how the code looks)for(int blackloop=0;blackloop256;blackloop++){//如果一个值大于0的话,就把它设成0if(DDGammaRamp.red[blackloop]  0) {//set the current value of DDGammaRamp.Red to 0.DDGammaRamp.red[blackloop]=0;//now let's update our primarylpDDGammaControl-SetGammaRamp(0, &DDGammaRamp);surface with the new gamma setting}//这个程序有点太快了,所以让它慢一点?Sleep(1);if(DDGammaRamp.green[blackloop]  0){//设当前DDGammaRamp.yellow的值到0.DDGammaRamp.green[blackloop]=0;lpDDGammaControl-SetGammaRamp(DDSGR_CALIBRATE, &DDGammaRamp);} Sleep(1);if(DDGammaRamp.blue[blackloop]  0){//设当前DDGammaRamp.Blue的值到0.DDGammaRamp. blue [blackloop]=0;lpDDGammaControl-SetGammaRamp(DDSGR_CALIBRATE, &DDGammaRamp);} Sleep(1);} //结束

  现在fade完成了,我们需要恢复所有原来的gamma值,否则屏幕一直是黑的:

  lpDDGammaControl-SetGammaRamp(0, &DDGammaOld);

  然后这就把它伪装好了。用这段代码你还可以做些其他的事情。例如:你可以修改这段代码使你的玩家被某物打中时,屏幕闪现红色;游水到有毒废料区时变成绿色;淹死了的时候变蓝。你也可以修改这段代码形成淡入,就留给其他人去做吧。

来源:https://www.tulaoshi.com/n/20160219/1614482.html

延伸阅读
标签: 电脑入门
我们在打开和关闭Launchpad 时,会出现淡入淡出的效果,但是有些用户觉得这样会导致Launchpad 的打开或关闭速度变慢,想要将淡入淡出效果关掉,那该怎么办呢? 如何禁用Launchpad 淡入淡出效果? 运行终端(应用程序 – 实用工具 – 终端),并分别执行下列命令: defaults write com.apple.dock springboard-show-duration ...
标签: 心理健康
肾结石是人们常常听到的一种疾病,它的危害是非常巨大的,会导致肾功能不全、泌尿系梗阻等。那么你知道在生活中我们怎样有效预防肾结石呢?有研究表明容易情绪化的人患肾结石,所以我们可以通过控制情绪达到预防的目的,下面图老师小编就为大家介绍一下吧! 情绪化人更易患肾结石 情绪化是我们每个人都有的,很多人并不认为一...
标签: 电脑入门
MAC系统中Dock栏里总是有着许多我们常用的或正在使用的应用程序,对于这些应用程序,我们可以通过Dock对他们进行管理。下面是具体的方法。 Dock管理应用程序的方法: 以iTunes为例,我们先启动iTunes。当然,不管我们是从应用程序文件夹中还是从Dock上启动应用程序,程序都是会显示在Dock上的,Dock即充当了快捷启动栏又是一个任务条。 ...
第一部分:得到Winamp的窗口 Winamp是一个32位的Windows应用程序。也就是说,我们可以使用32位的Windows编程的一些基础技术来实现控制Winamp,即使用Windows的消息系统。在你给Winamp发送消息之前,你必须得到Winamp窗口的句柄。这里有个方法,使用外部应用程序(例如你自己编写的VB应用)就可以达到要求。 Public Declare Functi...
在安装redhat9的时候,把vnc服务安装上 在win端安装cwinvnc软件 在linux上执行: vncserver 提示输入密码(这就是以后远程控制这个linux的密码) 可以使用vncpasswd修改密码 在win端执行vnc查看器,输入:serverIP:X 这个“X”就是执行vncserver命令的时候的输出,例如: New 'X' desktop is rh9:2 Starting applications specified in /root/...

经验教程

742

收藏

84
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部