⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ddbase.htm

📁 DirecetX中文手册
💻 HTM
📖 第 1 页 / 共 4 页
字号:
  <p ALIGN="JUSTIFY">要得到更多的关于DirectDraw中的blit函数的资料,请参阅本教程的<a
  href="reference.htm">DirectDraw参考手册</a>。</p>
  <hr>
</blockquote>

<blockquote>
  <b><p><a name="9、翻页(Page flipping)">9、翻页(Page flipping)</a></p>
  </b><p align="right"><font size="3"><a href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">在多媒体动画、动感游戏等软件中,翻页是一个相当关键的概念。与绘画师绘制动画片相比,计算机中的翻页技术与其具有相似之处。例如:绘画师在一叠相同的纸上绘画,画完一张再画下一张,在每一张上,绘画师使画面有略微的改动,于是,当你在这一叠纸上快速的翻页时,静止的图象便开始运动起来。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">DirectDraw中的翻页与上面这个过程极为相似。首先,你得设置好一个翻页链结构,它由一组DirectDraw页面组成,每一个页面都可以被轮流翻页至显示屏幕。当前正好位于显示屏幕的页面,我们称之为主页面(primary 
  surface),其后等待翻页至屏幕的页面,我们称之为后台缓存(Back 
  buffers)。应用程序在后台缓存上进行绘图操作,然后“翻一页”,将此页面翻页成为主页面,原来的主页面成为后台缓存,翻页后,你所进行的修改可以立即显示在屏幕上。与此同时,你可以在下一个即将翻页成为主页面的后台缓存上进行绘图。将这个翻页过程一直持续下去,直到动画结束。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">有了DirectDraw,整个翻页的任务并不是一件十分困难的工作。你既可以创建一个简单的双缓存翻页链结构(一个主页面和一个后台缓存),也可以创建一个使用起来更为灵活的多后台缓存翻页链结构。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">由于DirectDraw更多的使用的是硬件的特性,使得翻页变得极为快速,这个过程在屏幕上不会产生丝毫的闪烁,其速度可以达到与显示器的刷新率一样的数量级。在后面的DirectDraw教程中,我们将具体介绍如何在DirectDraw程序中实现翻页。</p>
  <hr>
</blockquote>

<blockquote>
  <b><p><a name="10、矩形(Rectangle)">10、矩形(Rectangle)</a></p>
  </b><p align="right"><font size="3"><a href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">在Windows编程中,屏幕上的对象都是以一个封闭矩形的形状出现的。一个封闭的矩形可以用两个点来确定,左上角和右下角。绝大多数应用程序使用RECT结构来定义一个封闭矩形,用于blit操作或碰撞检测(hit 
  detection)。RECT结构定义如下:</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY"
  style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
  color="#FFFFFF">typedef struct tagRECT { </font></p>
  <p ALIGN="JUSTIFY"
  style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
  face="宋体" size="3" color="#FFFFFF">LONG left; //矩形左上角的X坐标</font></p>
  <p ALIGN="JUSTIFY"
  style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
  face="宋体" size="3" color="#FFFFFF">LONG top; //矩形左上角的Y坐标</font></p>
  <p ALIGN="JUSTIFY"
  style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
  face="宋体" size="3" color="#FFFFFF">LONG right; //矩形右下角的X坐标</font></p>
  <p ALIGN="JUSTIFY"
  style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
  face="宋体" size="3" color="#FFFFFF">LONG bottom; //矩形右下角的Y坐标</font></p>
  <p ALIGN="JUSTIFY"
  style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
  face="宋体" size="3" color="#FFFFFF">} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT; </font></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">应该注意的是:这个矩形区域是排除边线的,并不包括它的右边线和下边线。所以,这个矩形的宽度应该等于right-left,而不是right-left+1;同理,矩形的高度等于bottom-top。</p>
  <hr>
</blockquote>

<blockquote>
  <b><p><a name="11、精灵动画(Sprite animation)">11、精灵动画(Sprite 
  animation)</a></p>
  </b><p align="right"><font size="3"><a href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">精灵动画被广泛的用于多媒体及游戏软件中。从最基本的意义上说,精灵是一个可以在背景屏幕上四处移动的图象,通常,这个图象的形状是不规则的。它的实现方法可以简单的这样来描述:将精灵画在可见的背景页面上,然后将所画的上一个精灵从页面上抹去,再将精灵画在页面的另一个地方,依次类推。于是,对观察者来说,精灵在屏幕上就动起来了。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">然而,在绝大多数情况下,我们所使用的精灵图象并不是规则的矩形,它们可能是多边形,也可能是一个支离破碎、完全不规则的图形。这就给我们实现精灵动画带来一个巨大的挑战,因为所有的blit函数所使用的都是规则的矩形区域,只有对于矩形区域,才能使blit操作更高效、流畅和便于调用。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">于是,在GDI编程中,使用了一种称为屏蔽的方法,这也跟电影的特级合成用的方法差不多,先让一个人在一块蓝布前表演一些看上去很惊险的动作,然后再将这些影片与事先拍好的背景合成一体,有蓝布的地方成了背景的画面,人就好象置身其中了。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">要在计算机中实现这样的动画,得有两幅图:一幅是精灵图(Sprite),一幅是屏蔽图(Mask:也称掩码图)。精灵图中使要显示的部分颜色保持不变,其余全为黑色,屏蔽图中使精灵的部分都为黑色,其余全为白色。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">有了这两幅图,经过两次blit运算,就可以把想要的精灵贴到背景上去了。第一次blit是让屏蔽图与背景进行布尔“与”(光栅操作代码为SRCAND)运算,第二次让精灵图与背景进行“异或”(光栅操作代码为SRCINVERT)运算。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">伪代码如下:</p>
</blockquote>

<blockquote>
  <p
  style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
  color="#FFFFFF">BitBlt( hDCdest, 0, 0, width, height, hDCMask, 0, 0, SRCAND );</font></p>
  <p
  style="background-color: rgb(0,0,128); margin-top: 0; margin-bottom: 0; padding-top: 2px"><font
  face="宋体" size="3" color="#FFFFFF">BitBlt( hDCdest, 0, 0, width, height, hDCSprite, 0, 
  0, SRCINVERT);</font></p>
</blockquote>

<blockquote>
  <ul>
    <li><font color="#FF0000">可以看出,在GDI中实现精灵动画是个比较复杂的过程,主要原因就是因为GDI的Blt函数不支持透明方式。在下面我们将看到,在DirectDraw中,由于其blit函数支持关键色,可以实现透明blit,所以,与GDI相比,在DirectDraw中实现精灵动画要变得简单得多。</font></li>
  </ul>
</blockquote>

<blockquote>
  <hr>
</blockquote>

<p ALIGN="JUSTIFY"> </p>

<blockquote>
  <p><b><a name="12、关键色(Color Key)">12、关键色(Color Key)</a></p>
  </b><p align="right"><font size="3"><a href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">DirectDraw的blit函数,支持带关键色(Color key)的透明blit操作。这就是说,如果在源页面上指定了一个颜色为关键色,那么在blit操作中,将视具有这种颜色的区域为透明,不会被传送到目标页面上。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">所以,不管你的精灵看起来是否象一个矩形,你必须首先使它们可以放在一个合适大小的矩形区域内。然后在这个包含了精灵图象的矩形内,将不属于精灵图象的部分全部使用同一种颜色,或使其在一个颜色范围之内。这个颜色或颜色范围必须是精灵图象中所没有用到的,它就是关键色。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">使用IDirectDrawSurface3::SetColorKey函数,将这个关键色设置给该页面。之后,调用IDirectDrawSurface3::Blt或IDirectDrawSurface3::BltFast函数,将该精灵blit到另一个页面上去,矩形区域中只有属于精灵的像素被映射了,其余带关键色的像素全被视为透明,对目标页面不会产生任何影响。这种在blit操作中,用于源页面表示透明区域的关键色称为源关键色(Source 
  color key)。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">除此之外,你还可以使用一种目标关键色,它所影响的只是目标页面。目标关键色定义了在blit操作中,目标页面上可以被覆盖的像素。举例来说,如果你要设计一个有一棵大树的背景,一个兔子在树后活动,当它经过树的时候,会被树遮住它的一部分或全部,以创造一种前后效果。那么,同样,你应该给背景页面上所有除了树的像素使用关键色,表示只有这些像素才能允许在blit中被使用。使用IDirectDrawSurface3::SetColorKey函数,将这个关键色设置给背景页面。然后调用IDirectDrawSurface3::Blt或IDirectDrawSurface3::BltFast函数并且指定了使用目标关键色,那么,当你把包含了兔子的页面blit到目标页面上大树所在的位置,大树总是完整的,兔子的某部分会被大树遮挡住,就象出现在树后一样,前后效果出现了。</p>
  <hr>
</blockquote>

<blockquote>
  <b><p><a name="13、补丁(Patching)">13、补丁(Patching)</a></b></p>
  <p align="right"><font size="3"><a href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">在精灵动画的过程中,当你把精灵画到一个新的位置之前,你必须将上一个位置的精灵从背景上抹掉。当然,最简单的做法是莫过于重新刷新整个背景,使其还原,然后再将精灵画上去。但是,这样做会使你失去很多的时间,而时间对于动画来说是非常宝贵的,而且最主要的一点就是,你的屏幕会因为大面积的刷新而闪烁。所以,你应该跟踪精灵所在的上一个矩形位置,然后在画下一个精灵之前,只重画这一个区域。这种方法被形象的称为打“补丁”(patching)”。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">要给精灵的上一个位置打上补丁,你必须在上一步绘制该精灵之前,把这个矩形区域的背景内容保存下来,在你要画下一个精灵之前,用这个补丁去还原这块区域。这个过程会进行得非常和谐,因为与刷新整个背景相比,它不会占用太多的时间。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">打补丁的方法可以按以下几个步骤进行:</p>
</blockquote>

<blockquote>
  <ol>
    <li>将保存的精灵的上一个位置的背景图象复制到背景上。</li>
    <li>把将要绘制精灵的位置的背景图象保存下来。</li>
    <li>将精灵blit到背景图象上。</li>
    <li>重复步骤1</li>
  </ol>
  <hr>
</blockquote>

<blockquote>
  <b><p><a name="14、范围检查(Bounds Checking)与碰撞检测(Hit Detection)">14、范围检查(Bounds 
  Checking)与碰撞检测(Hit Detection)</a></b></p>
  <p align="right"><font size="3"><a href="#目录">返回目录</a></font></p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">范围检查和碰撞检测是编程中与精灵动画相关联的两个重要任务。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">范围检查用来限制精灵的可能的活动范围,例如,在程序中,你可能想让某一个精灵限制在屏幕的某个矩形区域内活动,要完成这一步,你应该在精灵每移动一步之前检查精灵所在的位置,使这个位置的坐标保持在一个矩形范围之内(通常是一个RECT结构),并且阻止精灵移出这个矩形区域。DirectDraw并没有提供范围检查的服务函数,但是你可以用很简单的程序实现这样一个功能。</p>
</blockquote>

<blockquote>
  <p ALIGN="JUSTIFY">碰撞检测,或称为冲突检测,用来判断某一时刻是否有多个精灵处于同一位置。大多数的碰撞检测是检查某个精灵的包络矩形是否与另一个精灵的包络矩形有重合部分。因为有太多种不同的方法来实现不同种类的碰撞检测,所以DirectDraw也没有为用户提供碰撞检测的服务函数。用户可以根据自己的需要编制碰撞检测的程序。</p>
</blockquote>
</font>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -