第七章 游戏中的冲突检测_第1页
第七章 游戏中的冲突检测_第2页
第七章 游戏中的冲突检测_第3页
第七章 游戏中的冲突检测_第4页
第七章 游戏中的冲突检测_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Flash游戏编程

肖刚闽江学院电子系计算机教研室Email:fuzhou3721@163.com第七章游戏中的冲突检测教学提要冲突检测的方法介绍基于位图的冲突检测实例“战场生存记”中的冲突检测认识Flash游戏中的三种冲突检测算法及其边界条件概要冲突检测是指检测两个对象是否有重叠的部分或者某个对象是否覆盖了某个点。许多游戏必须使用到冲突检测,例如:格斗游戏,两个对战角色是否相碰是出招是否有效的前提。台球游戏,如果台球在运动的过程中相碰,那么它应该有动量传递。正确地进行冲突检测,是这些游戏设计成败的关键点。1冲突检测的方法介绍ActionScript给我们提供了三种冲突检测的方法。列表如下:名称描述提供者hitTestObject(目标显示对象)检测两个对象是否有重叠的部分DisplayObjecthitTestPoint(x,y[,形状标记])检测本对象是否覆盖了某个点DisplayObjecthitTest(参数列表)检测两个BitmapData是否有重叠的部分BitmapData1.1检测两个显示对象是否有重叠的部分方法名称:hitTestObject语法:源显示对象.hitTestObject(目标显示对象);提供者:DisplayObject。凡是DisplayObject子类的类实例,都能够使用本方法。如MovieClip类。作用:使用显示对象的hitTestObject方法可以检测两个显示对象是否有重叠的部分。它的返回值true表示有重叠,false表示没有重叠。1.1.1边界条件但需要注意的是,hitTestObject函数以显示对象的外接矩形框作为评判是否重叠的依据。两个显示对象图像部分重叠当然好理解,但是如下图中的两个影片剪辑(矩形框是外接矩形区域示意图),在视觉上虽然没有重叠,但是由于它们的矩形框区域有交叉的部分,所以hitTestObject的返回值为true。1.1.2旋转中的边界条件还有一个细节需要注意,如果影片剪辑在编辑过程中,或者是运行过程中有旋转,那么此时的情况会如何呢?例如上图中的五角星,如果旋转了一个某个角度,如下图所示:那么,进行冲突检测的时候,采用剪辑原有的方框(实线),还是大虚线方框,抑或是小虚线方框作为冲突检测的边界条件?

实验结果表明,Flash采用的是大虚线方框作为冲突检测的边界条件。

1.2检测显示对象与某一点是否重叠方法名称:hitTestPoint语法:显示对象.hitTestPoint(x,y[,形状标记]);提供者:DisplayObject。凡是DisplayObject子类的类实例,都能够使用本方法。如MovieClip类。作用:使用hitTestPoint方法可检测显示对象与某个坐标点是否重叠。形状标记为false(默认)时,使用显示对象的外接矩形框作为判断的依据,为true时,使用显示对象的实体像素作为判断的依据与坐标点进行检测。1.2.1形状标记如下图所示,五角星剪辑和三个坐标点A、B、C在形状标记不同取值下hitTestPoint的返回值如下表:形状标记truefalseAfalsetrueBtruetrueCfalsefalse1.2.2简化的冲突检测大多数游戏中,将尺寸较小的剪辑简化为点,用hitTestPoint检测它与某个对象是否冲突。例如战斗机游戏中,所有的子弹都被简化成质点。这显著提高了游戏的性能,也使爆炸点更贴近战斗机的轮廓。示例游戏“战场生存记”中就采用点探测的方式进行冲突检测。1.3对位图数据进行像素级别的冲突检测方法名称:hitTest语法:BitmapData对象.hitTest(参数列表);提供者:BitmapData作用:使用BitmapData的hitTest方法可以检测BitmapData与另一个Point、Rectangle、Bitmap或者BitmapData是否有重叠。它以透明度域值作为有效像素的根据,低于域值的是无效像素,等于或者高于域值的是有效像素,如果两个对象比较的区域内有重叠的有效像素,则返回true,否则返回false。1.3.1hitTest的使用技巧思路hitTest方法给我们提供了一个实现两个可视对象实体冲突检测的思路。将游戏中需要进行严格的实体冲突检测的对象制作成带透明通道的位图,导入Flash中使用。通过BitmapData的draw方法从现有的影片剪辑中获取位图快照,然后再使用hitTest方法进行冲突检测。好处:实现真正的与视觉完全一致的冲突检测结果获取动画的位图快照,从而在两个动画之间进行基于位图的冲突检测,大大提高了冲突检测的真实性。缺点是运行效率降低了。1.3.2hitTest方法的参数hitTest有5个参数,按顺序为:firstPoint(Point):设定源BitmapData左上角在比较空间中的位置。firstAlphaThreshold(uint):设定源BitmapData对象被视为不透明的最小Alpha通道值,取值0~255。Alpha值小于这个值的像素不参与重叠计算。secondObject(Object):目标对象,目标对象可以是Rectangle、Point、Bitmap或BitmapData对象。secondBitmapDataPoint(Point):可选参数,当目标对象为BitmapData对象时才使用。表示目标对象左上角在比较空间中的位置。secondAlphaThreshold(uint):可选参数,设定目标BitmapData对象被视为不透明的最小Alpha通道值。2基于位图的冲突检测实例演示程序:小心触电你扮演一个小人物,要穿过到处都是高压电的区域,你不能碰到任何带电的东西,到达目的地即可获胜。程序分析:很明显,这个游戏的关键技术就是如何精确判断小人与众多各种剪辑对象之间是否有重叠的部分,如果有,则表示触电,游戏失败,如果碰到游戏结束所在位置的显示对象,表示游戏胜利。我们单独抽出冲突检测部分进行讲解。我们要完成的工作是用鼠标引导小人运动,用一个影片剪辑模拟带电物体,如果带电物体碰到小人,就输出一条信息。2.1设计步骤新建Flash文档(ActionScript3.0),设置文档的大小为:550*200,帧频率为40。设计两个影片剪辑,一个是小人,一个是有三条天线的带电体,是个会旋转的动画,如下图所示:注意两个剪辑的中心位置都必须定义在左上角,并且要在剪辑内添加一个透明的方块,用来覆盖动画中可能接触到的区域。如天线剪辑内就有一个这样的方块。这样做的目的是为了在任意时刻用draw方法获得剪辑的快照时不会丢失部分动画内容。2.2设计步骤将这两个剪辑都布置在舞台上,设置小人的实例名称为boy。进入boy剪辑内部,在其第一帧输入如下代码:startDrag(true);Mouse.hide();

这样运行中这个小人将会跟随鼠标移动,并且鼠标指针被隐藏了。2.3设计步骤进入天线剪辑,在其第一帧输入以下代码:varenemy:MovieClip=MovieClip(root).boy;addEventListener(Event.ENTER_FRAME,bHitTest);functionbHitTest(target:Event){ varbd1:BitmapData=newBitmapData(width,height,true,0x00000000); varbd2:BitmapData=newBitmapData(enemy.width,enemy.height,true,0x000000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论