📄 01_9_13_21.asp.html
字号:
<html><head><meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
<TITLE>计算机世界网-用DirectDraw编写动画程序</TITLE></HEAD>
<style>
.a14{font-size:14px;text-indent:25px;line-height:20px}
.f{font-size:18px;color=#0f3ccd}
img{border:0px;}
td,p,input{font-fammily:verdana,宋体;font-size:12px;}
A:link {text-decoration:none;color:black}
A:visited {text-decoration:none;color:#80006f}
A:hover {text-decoration:underline;color:black}
</style>
<center>
<BODY topmargin=2 leftmargin=0>
<style>
.v12{font-size:10pt;color:"#ffffff";FONT-WEIGHT: bold}
.v14{font-size:14px;text-indent:25px;line-height:20px}
img{border:0px;}
td,p,input,select{font-fammily:verdana,宋体;font-size:12px;}
A:link {text-decoration:none;color:black}
A:visited {text-decoration:none;color:#80006f}
A:hover {text-decoration:underline;color:black}
</style>
<style>
.v13{font-size:10pt;color:"#ffffff";FONT-WEIGHT: bold}
.v12{font-size:13px;color:"#4C029C";FONT-WEIGHT: bold}
.v14{font-size:14px;text-indent:25px;line-height:20px}
img{border:0px;}
td,p,input,select{font-fammily:verdana,宋体;font-size:12px;}
A:link {text-decoration:none;color:black}
A:visited {text-decoration:none;color:#80006f}
A:hover {text-decoration:underline;color:black}
</style>
<!--头-->
<table align=center cellpadding="0" cellspacing="0" border="0" width="767">
<tr><td valign=bottom>
<table cellpadding="0" cellspacing="0" border=0>
<tr><td valign=top><img src="../../../../../center/image/ccwlogo.gif"></td></tr>
<tr><td height="27" valign=top><img src="../../../../../center/image/knowledge.gif" width="207" height="27"></td></tr>
</table></td>
<td valign=bottom width=556 bgcolor="#4c029c" height=96>
<table cellpadding="0" cellspacing="0" border=0 width=556 bgcolor="#4c029c" height=96>
<tr><td height=25 valign=bottom bgcolor="#ffffff" colspan=2 ><img src="../../../../../image2002/top.gif" usemap="#F"></td></tr>
<tr valign=middle >
<td align=center valign=middle height="60" align=center>
<!-- <a href="http://www.ccw.com.cn/search/" target=_blank><img src="../../../../../img2/esearch.GIF" border=0 width=468 height=60></a> --><a href="http://www.ccw.com.cn/html/search/thememail/" target=_blank><img src="../../../../../img2/topbanner_thememail.GIF" border=0 width=468 height=60></a>
</td>
<td align=center width=15%>
<table width=95%>
<tr><td><a href="mailto:center@ccw.com.cn?subject=我要投稿:" target=_blank><font class=v13>我要投稿</a><br><a href="mailto:center@ccw.com.cn?subject=编读往来"><font class=v13>编读往来</a><br><a href="javascript:AddBookMark('计算机世界网首页')"><font class=v13>加入收藏</a></font></td></tr>
</table>
</td>
</tr>
<tr><td bgcolor="#ffffff" height=1 colspan=2 ></td></tr>
<tr><td bgcolor="#b4aafc" height=2 colspan=2 ></td></tr></table>
<map name="F">
<area href="http://www.ccw.com.cn/" shape="rect" coords="29, 3, 61, 18" target=_blank>
<area href="http://www.ccw.com.cn/news1/" shape="rect" coords="72, 3, 143, 18" target=_blank>
<area href="http://www.ccw.com.cn/center/" shape="rect" coords="155, 2, 216, 18" target=_blank>
<area href="http://www.ccw.com.cn/work/" shape="rect" coords="225, 2, 299, 18" target=_blank>
<area href="http://www.ccw.com.cn/search/" shape="rect" coords="310, 3, 364, 19" target=_blank>
<area href="http://www3.ccw.com.cn/" shape="rect" coords="372, 2, 412, 19" target=_blank>
<area href="http://www2.ccw.com.cn/" shape="rect" coords="424, 2, 550, 18" target=_blank></map>
</td></tr>
<tr><td colspan=2 bgcolor="#b4aafc">
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr>
<td width=26% align=center><font class=v12>【2003年6月24日】 </font></td>
<td CLASS=V12> <a href="http://www.ccw.com.cn/center/topic.asp">专 题</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/tech.asp">技 术</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/prod.asp">产 品</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/app.asp">应 用</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/net.asp">网 络</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/prog.asp">编 程</a> /</td>
<td CLASS=V12><a href="http://www.ccw.com.cn/center/skill.asp">技 巧</a> </td>
</tr>
</table>
</td></tr>
</table>
<table align=center width=728>
<tr><td align=center><br><h2><font color='#0f3ccd'>用DirectDraw编写动画程序</font></h2>
<br><b>成都 张巍</b>
</td></tr><tr><td align=right>01-9-13 下午 04:27:21<br><hr size=1 width=718 color=#f46240></td></tr></table><br>
<table align=center width=728><tr><td valign=top width=600>
<table width=100% ><tr>
<td class=a14><b>一.理论篇</b></td>
</tr></table><table width=100% ><tr>
<td class=a14> 说起DirectDraw也许大多数人还不知其为何物,但一提到DirectX恐怕每一个Computer Fan 和Game
Fan都再耳熟不过了。(什么!你没听说过DirectX!?Oh,My god!来人哪,拉下去重责五十大板!)DirectX又叫Game SDK,它最大的特点是直接对硬件的抽象层(HAL)进行操作,利用这个特点可以制作出高性能的Windows游戏。具体信息请见http://www.
microsoft.com/directx/default.asp。</td>
</tr></table><table width=100% ><tr><td class=a14>
DirectDraw就是DirectX5的6个组件之一。DirectX5的其它5个组件分别是:</td></tr></table><table width=100% ><tr><td class=a14>
Direct3D:提供了3D硬件接口。</td></tr></table><table width=100% ><tr><td class=a14>
DirectSound:立体声和3D声音效果,同时管理声卡的内存。</td></tr></table><table width=100% ><tr><td class=a14>
DirectPlay:支持开发多人网络游戏,并能处理游戏中网络之间的通信问题。</td></tr></table><table width=100% ><tr><td class=a14>
DirectInput:为大量的设备提供输入支持。</td></tr></table><table width=100% ><tr><td class=a14>
DirectSetup:自动安装DirectX驱动程序。</td></tr></table><table width=100% ><tr>
<td class=a14> 而DirectDraw则是DirectX的基石,DirectX的其它组件都是建立在它的基础之上的。DirectDraw使用页面切换的方法实现动画,它不仅可以访问系统内存,还可以访问显示内存,这是以往的Windows程序员所不能的。另外,我们利用DirectDraw还可以生成、移动、剪切、转换、合成图像数据,从而编写出各种“炫丽多彩”图形的应用程序。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 介绍了这么一大堆DirectX的理论,你的头是不是已经有些大了呢?心中一定在嘀咕:“哼,原来是个江湖骗子,光说不练。”各位看官不要着急,不把这些基础理论搞懂就去看下面的程序,你肯定是“洋鬼子看戏——目瞪口呆”。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 首先,让我们先了解一下DirectDraw的三个重要概念。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 1.表面</td>
</tr></table><table width=100% ><tr>
<td class=a14> 在用DirectDraw编写程序时,我们先要创建若干个图形数据缓冲区,并把这些图形数据装入其中,再进行转换、拉伸、挎贝等操作,并且还可以显示这些缓冲区中的图形数据,这些缓冲区就称为表面。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 表面可以分为几类。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 主表面(primary surface)是用户在屏幕上可以看到的,它是显示内存的一部分。所有DirectDraw程序都有主表面,而且只有一个。它在DirectDraw表面对象之前就已经存在了,因此不能改变它的尺寸、格式和位置。主表面有一个很重要的特性——翻转。页面翻转用于程序中,可以产生相当平滑、不闪烁的动画。一个可以翻转的主表面实际上是两个表面,一个是可见的,一个是不可见的。不可见的表面称为后备缓冲区。当发生表面翻转时,后备缓冲区就成为可见的,而以前的可见表面则成为后备缓冲区。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 还有一种表面叫离屏表面(off_screen surface),它是不能直接见到的。离屏表面作为存储缓冲区,有助于表面之间的互相切换,它的大小是可以改变的。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 主表面和离屏表面都分为有调色板的和无调色板的这两类。像素深度为8位(256色)的表面称为有调色板的表面;而像素深度为16位(64K色)、24位(16M色)的像素表面称为无调色板的表面,它们存储实际的色彩值(RGB值)。在本文下面的程序中,我们使用24位表面即无调色板的表面。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 2. Bltting</td>
</tr></table><table width=100% ><tr>
<td class=a14> Bltting是用于复制图形的语言,可以将图像从一处拷贝到另一处。例如大家所熟悉的CDC类(设备描述表类)的BitBlt()就是具有这样功能的函数。在DirectDraw中,典型的blt操作是将离屏表面的内容拷贝到一个后备缓冲区,而一般的blt操作调用一个源表面和一个目标表面,把源表面的内容拷贝到目标表面中,不仅可以整体拷贝源表面,而且还可以拷贝源表面内的任何矩形区域到目标表面的任何位置。blt还支持透明拷贝,就是指表面中的某一像素在blt过程中可以不予以拷贝,而这个像素值是由色彩键码(DDCOLOR
KEY )决定的。</td>
</tr></table><table width=100% ><tr>
<td class=a14> DirectDraw中有三个支持blt的函数,它们是Blt()、BltBatch()、BltFast()。Blt(
)用得最多,BltFast()的速度比Blt()要快,但功能却很有限,例如不支持拉伸、剪切等操作。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 还有一个函数BltSurface(),它是DirectWin类的一个成员函数,Blt()、BltFast()更具有适应性,并且使用起来更加简单。例如,当我们把源表面拷贝到目标表面外时需要裁剪,而BltFast()不支持裁剪。这时我们使用BltSurface()函数,它在内部使用Blt()和
BltSurface()函数,并根据情况自动执行裁剪。</td>
</tr></table><table width=100% ><tr>
<td class=a14> 3.色彩键码</td>
</tr></table><table width=100% ><tr>
<td class=a14> DirectDraw 可以把某种颜色或某个范围的颜色指定为一个颜色值,这个颜色值是由DDCOLORKEY结构即色彩键码说明的,DDCORLORKEY结构说明如下:</td>
</tr></table><table width=100% ><tr><td class=a14>
typedef struct _DDCOLORKEY{ </td></tr></table><table width=100% ><tr><td class=a14>
DWORD dwColorSpaceLowValue; //颜色范围的低端</td></tr></table><table width=100% ><tr><td class=a14>
DWORD dwColorSpaceHighValue; //颜色范围的高端</td></tr></table><table width=100% ><tr><td class=a14>
} DDCOLORKEY;</td></tr></table><table width=100% ><tr>
<td class=a14> 当我们对表面进行拷贝操作时,表面中哪些像素不被拷贝是由色彩键码决定的。例如当DDCOLORKEY结构的两个分量都为零时,表面内所有置为零的像素都不能被拷贝。又例如,当表面是24位RGB模式时,若想指定RGB=(120,120,120)像素不被拷贝,则应该:</td>
</tr></table><table width=100% ><tr><td class=a14>
DDCOLORKEY ddck;</td></tr></table><table width=100% ><tr><td class=a14>
ddck.dwColorSpaceLowValue=RGB(120,120,120);</td></tr></table><table width=100% ><tr><td class=a14>
ddck.dwColorSpaceHighValue=RGB(120,120,120);</td></tr></table><table width=100% ><tr><td class=a14>
surf→SetColorKey(DDCKEY_SRCBLT,&ddck);</td></tr></table><table width=100% ><tr>
<td class=a14> 其中SetColorKey()函数是把色彩键码赋给表面surf。这样,在对表面surf的 blt操作期间RGB值为(120,120,120)的像素不能被拷贝。</td>
</tr></table><table width=100% ><tr>
<td class=a14> <b>二.实践篇</b></td>
</tr></table><table width=100% ><tr>
<td class=a14> 古语云:“君欲善其事,必先利其器”,在编写DirectDraw应用程序之前,我们先要准备好以下工具:</td>
</tr></table><table width=100% ><tr><td class=a14>
Windows95、Windows98或WindowsNT4.0</td></tr></table><table width=100% ><tr><td class=a14>
DirectX 驱动程序(最好是DirectX3.0以上版本)</td></tr></table><table width=100% ><tr><td class=a14>
DirectX SDK</td></tr></table><table width=100% ><tr><td class=a14>
Visual C++ 5.0</td></tr></table><table width=100% ><tr>
<td class=a14> Direct SDK包括开发基于DirectX应用程序所需的全部文件,全部安装需要80几兆的硬盘空间。其实你只需安装必需的头文文件(.h文件)和库文件(.lib文件)就行了。</td>
</tr></table><table width=100% ><tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -