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

📄 subject_54101.htm

📁 vc
💻 HTM
字号:
<p>
序号:54101 发表者:radargroup 发表日期:2003-09-25 15:53:18
<br>主题:怎么用directx来开发桌面精灵动画?
<br>内容:我感得用gdi开发的桌面精灵好象性能不好。那怎么用directx来做呢?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:radargroup 回复日期:2003-09-30 09:15:51
<br>内容:谁能给一点提示,不会没有人知道吧?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:piscesmary 回复日期:2003-10-04 09:04:42
<br>内容:&nbsp;&nbsp;精灵动画(Sprite animation) 精灵动画被广泛的用于多媒体及游戏软件中。从最基本的意义上说,精灵是一个可以在背景屏幕上四处移动的图象,通常,这个图象的形状是不规则的。它的实现方法可以简单的这样来描述:将精灵画在可见的背景页面上,然后将所画的上一个精灵从页面上抹去,再将精灵画在页面的另一个地方,依次类推。于是,对观察者来说,精灵在屏幕上就动起来了。 然而,在绝大多数情况下,我们所使用的精灵图象并不是规则的矩形,它们可能是多边形,也可能是一个支离破碎、完全不规则的图形。这就给我们实现精灵动画带来一个巨大的挑战,因为所有的blit函数所使用的都是规则的矩形区域,只有对于矩形区域,才能使blit操作更高效、流畅和便于调用。 于是,在GDI编程中,使用了一种称为屏蔽的方法,这也跟电影的特级合成用的方法差不多,先让一个人在一块蓝布前表演一些看上去很惊险的动作,然后再将这些影片与事先拍好的背景合成一体,有蓝布的地方成了背景的画面,人就好象置身其中了。 要在计算机中实现这样的动画,得有两幅图:一幅是精灵图(Sprite),一幅是屏蔽图(Mask:也称掩码图)。精灵图中使要显示的部分颜色保持不变,其余全为黑色,屏蔽图中使精灵的部分都为黑色,其余全为白色。 有了这两幅图,经过两次blit运算,就可以把想要的精灵贴到背景上去了。第一次blit是让屏蔽图与背景进行布尔“与”(光栅操作代码为SRCAND)运算,第二次让精灵图与背景进行“异或”(光栅操作代码为SRCINVERT)运算。 伪代码如下: BitBlt( hDCdest, 0, 0, width, height, hDCMask, 0, 0, SRCAND ); BitBlt( hDCdest, 0, 0, width, height, hDCSprite, 0, 0, SRCINVERT); 可以看出,在GDI中实现精灵动画是个比较复杂的过程,主要原因就是因为GDI的Blt函数不支持透明方式。在下面我们将看到,在DirectDraw中,由于其blit函数支持关键色,可以实现透明blit,所以,与GDI相比,在DirectDraw中实现精灵动画要变得简单得多。 十二、关键色(Color Key) DirectDraw的blit函数,支持带关键色(Color key)的透明blit操作。这就是说,如果在源页面上指定了一个颜色为关键色,那么在blit操作中,将视具有这种颜色的区域为透明,不会被传送到目标页面上。 所以,不管你的精灵看起来是否象一个矩形,你必须首先使它们可以放在一个合适大小的矩形区域内。然后在这个包含了精灵图象的矩形内,将不属于精灵图象的部分全部使用同一种颜色,或使其在一个颜色范围之内。这个颜色或颜色范围必须是精灵图象中所没有用到的,它就是关键色。 使用IDirectDrawSurface3::SetColorKey函数,将这个关键色设置给该页面。之后,调用IDirectDrawSurface3::Blt或IDirectDrawSurface3::BltFast函数,将该精灵blit到另一个页面上去,矩形区域中只有属于精灵的像素被映射了,其余带关键色的像素全被视为透明,对目标页面不会产生任何影响。这种在blit操作中,用于源页面表示透明区域的关键色称为源关键色(Source color key)。 除此之外,你还可以使用一种目标关键色,它所影响的只是目标页面。目标关键色定义了在blit操作中,目标页面上可以被覆盖的像素。举例来说,如果你要设计一个有一棵大树的背景,一个兔子在树后活动,当它经过树的时候,会被树遮住它的一部分或全部,以创造一种前后效果。那么,同样,你应该给背景页面上所有除了树的像素使用关键色,表示只有这些像素才能允许在blit中被使用。使用IDirectDrawSurface3::SetColorKey函数,将这个关键色设置给背景页面。然后调用IDirectDrawSurface3::Blt或IDirectDrawSurface3::BltFast函数并且指定了使用目标关键色,那么,当你把包含了兔子的页面blit到目标页面上大树所在的位置,大树总是完整的,兔子的某部分会被大树遮挡住,就象出现在树后一样,前后效果出现了。 <BR>&nbsp;&nbsp; 补丁(Patching) 在精灵动画的过程中,当你把精灵画到一个新的位置之前,你必须将上一个位置的精灵从背景上抹掉。当然,最简单的做法是莫过于重新刷新整个背景,使其还原,然后再将精灵画上去。但是,这样做会使你失去很多的时间,而时间对于动画来说是非常宝贵的,而且最主要的一点就是,你的屏幕会因为大面积的刷新而闪烁。所以,你应该跟踪精灵所在的上一个矩形位置,然后在画下一个精灵之前,只重画这一个区域。这种方法被形象的称为打“补丁”(patching)”。 要给精灵的上一个位置打上补丁,你必须在上一步绘制该精灵之前,把这个矩形区域的背景内容保存下来,在你要画下一个精灵之前,用这个补丁去还原这块区域。这个过程会进行得非常和谐,因为与刷新整个背景相比,它不会占用太多的时间。 打补丁的方法可以按以下几个步骤进行: 将保存的精灵的上一个位置的背景图象复制到背景上。 把将要绘制精灵的位置的背景图象保存下来。 将精灵blit到背景图象上。 重复步骤1 <BR>&nbsp;&nbsp;范围检查(Bounds Checking)与碰撞检测(Hit Detection) 范围检查和碰撞检测是编程中与精灵动画相关联的两个重要任务。 范围检查用来限制精灵的可能的活动范围,例如,在程序中,你可能想让某一个精灵限制在屏幕的某个矩形区域内活动,要完成这一步,你应该在精灵每移动一步之前检查精灵所在的位置,使这个位置的坐标保持在一个矩形范围之内(通常是一个RECT结构),并且阻止精灵移出这个矩形区域。DirectDraw并没有提供范围检查的服务函数,但是你可以用很简单的程序实现这样一个功能。 碰撞检测,或称为冲突检测,用来判断某一时刻是否有多个精灵处于同一位置。大多数的碰撞检测是检查某个精灵的包络矩形是否与另一个精灵的包络矩形有重合部分。因为有太多种不同的方法来实现不同种类的碰撞检测,所以DirectDraw也没有为用户提供碰撞检测的服务函数。用户可以根据自己的需要编制碰撞检测的程序。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:piscesmary 回复日期:2003-10-04 09:10:53
<br>内容:我有关于DirectX的一些详细资料!需要的话告诉我!!我的信箱:pisces_mary@etang.com<BR>oicq;180631187
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:radargroup 回复日期:2003-10-09 15:48:59
<br>内容:pises_mary:<BR>谢谢你的帮助,我还在尝试把它做出来。你的资料我非常需要,我现在就是看msdn,费劲死了,谢谢!<BR>你也喜欢3d吗?我们爱好好象蛮近的,我的邮箱是:radargroup@vip.sina.com<BR>qq有一个号,但好久都没上了,你常上吗?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:piscesmary 回复日期:2003-10-11 11:17:01
<br>内容:我经常上qq的!有空常联系吧!我的msn:pisces_mary@hotmail.com
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xinlu 回复日期:2003-10-14 08:57:06
<br>内容:&lt;BLOCKQUOTE&gt;引用“第3楼”所言<BR>&lt;Q&gt;我有关于DirectX的一些详细资料!需要的话告诉我!!我的信箱:pisces_mary@etang.com&nbsp;&nbsp;oicq;180631187&lt;/Q&gt;&lt;/BLOCKQUOTE&gt;<BR><BR>能不能给我一份呀?谢谢你啦<BR>xinlu0311@163.com<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

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