版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Flash游戏编程游戏编程肖肖 刚刚闽江学院电子系计算机教研室闽江学院电子系计算机教研室Email:第七章第七章 游戏中的冲突检测游戏中的冲突检测 教学提要冲突检测的方法介绍冲突检测的方法介绍基于位图的冲突检测实例基于位图的冲突检测实例“战场生存记战场生存记”中的冲突检测中的冲突检测认识认识Flash游戏中的三种冲突检测算法及其边界条件游戏中的三种冲突检测算法及其边界条件概要概要冲突检测是指检测两个对象是否有重叠的部分冲突检测是指检测两个对象是否有重叠的部分或者某个对象是否覆盖了某个点。或者某个对象是否覆盖了某个点。许多游戏必须使用到冲突检测,例如:许多游戏必须使用到冲突检测,例如:格斗游戏,
2、两个对战角色是否相碰是出招是否有效格斗游戏,两个对战角色是否相碰是出招是否有效的前提。的前提。台球游戏,如果台球在运动的过程中相碰,那么它台球游戏,如果台球在运动的过程中相碰,那么它应该有动量传递。应该有动量传递。正确地进行冲突检测,是这些游戏设计成败的正确地进行冲突检测,是这些游戏设计成败的关键点。关键点。1 冲突检测的方法介绍冲突检测的方法介绍 ActionScript给我们提供了三种冲突检测的方给我们提供了三种冲突检测的方法。列表如下:法。列表如下: 名称名称描述描述提供者提供者hitTestObject(目标显示对象)检测两个对象是否有重叠的部分DisplayObjecthitTest
3、Point(x,y,形状标记)检测本对象是否覆盖了某个点DisplayObjecthitTest(参数列表)检测两个BitmapData是否有重叠的部分BitmapData1.1 检测两个显示对象是否有检测两个显示对象是否有重叠的部分重叠的部分方法名称:方法名称:hitTestObject语法:语法:源显示对象源显示对象.hitTestObject(目标显示对象目标显示对象); 提供者:提供者:DisplayObject。凡是。凡是DisplayObject子类的类实子类的类实例,都能够使用本方法。如例,都能够使用本方法。如MovieClip类。类。作用:作用:使用显示对象的使用显示对象的hi
4、tTestObject方法可以检测两个方法可以检测两个显示对象是否有重叠的部分。它的返回值显示对象是否有重叠的部分。它的返回值true表示表示有重叠,有重叠,false表示没有重叠。表示没有重叠。 1.1.1 边界条件边界条件但需要注意的是,但需要注意的是, hitTestObject函数以显示对象的函数以显示对象的外接矩形框作为评判是否重叠的依据。两个显示对象外接矩形框作为评判是否重叠的依据。两个显示对象图像部分重叠当然好理解,但是如下图中的两个影片图像部分重叠当然好理解,但是如下图中的两个影片剪辑(矩形框是外接矩形区域示意图),在视觉上虽剪辑(矩形框是外接矩形区域示意图),在视觉上虽然没有
5、重叠,但是由于它们的矩形框区域有交叉的部然没有重叠,但是由于它们的矩形框区域有交叉的部分,所以分,所以hitTestObject的返回值为的返回值为true。 1.1.2 旋转中的边界条件旋转中的边界条件还有一个细节需要注意,如果影片剪辑在编辑过程中,或者是运还有一个细节需要注意,如果影片剪辑在编辑过程中,或者是运行过程中有旋转,那么此时的情况会如何呢?例如上图中的五角行过程中有旋转,那么此时的情况会如何呢?例如上图中的五角星,如果旋转了一个某个角度,如下图所示:星,如果旋转了一个某个角度,如下图所示:那么,进行冲突检测的时候,采用剪辑原有的方框(实线),还那么,进行冲突检测的时候,采用剪辑原
6、有的方框(实线),还是大虚线方框,抑或是小虚线方框作为冲突检测的边界条件?是大虚线方框,抑或是小虚线方框作为冲突检测的边界条件? 实验结果表明,实验结果表明,Flash采用的是采用的是大虚线方框大虚线方框作为冲突检测的边界条件。作为冲突检测的边界条件。 1.2 检测显示对象与某一点是检测显示对象与某一点是否重叠否重叠 方法名称:方法名称:hitTestPoint 语法:语法:显示对象显示对象.hitTestPoint(x,y,形状标记形状标记); 提供者:提供者:DisplayObject。凡是。凡是DisplayObject子类的类实子类的类实例,都能够使用本方法。如例,都能够使用本方法。如
7、MovieClip类。类。作用:作用:使用使用hitTestPoint方法可检测显示对象与某个坐标点是否重方法可检测显示对象与某个坐标点是否重叠。形状标记为叠。形状标记为false(默认)时,使用显示对象的外接矩形(默认)时,使用显示对象的外接矩形框作为判断的依据,为框作为判断的依据,为true时,使用显示对象的实体像素作时,使用显示对象的实体像素作为判断的依据与坐标点进行检测。为判断的依据与坐标点进行检测。 1.2.1 形状标记形状标记如下图所示,如下图所示,五角星剪辑和三个坐标点五角星剪辑和三个坐标点A、B、C在形状标在形状标记不同取值下记不同取值下hitTestPoint的返回值如下表:
8、的返回值如下表: 形状标记形状标记truefalseAfalsetrueBtruetrueCfalsefalse1.2.2 简化的冲突检测简化的冲突检测大多数游戏中,将尺寸较小的剪辑简化为点,大多数游戏中,将尺寸较小的剪辑简化为点,用用hitTestPoint检测它与某个对象是否冲突。检测它与某个对象是否冲突。例如战斗机游戏中,所有的子弹都被简化成质点。例如战斗机游戏中,所有的子弹都被简化成质点。这显著提高了游戏的性能,也使爆炸点更贴近战斗这显著提高了游戏的性能,也使爆炸点更贴近战斗机的轮廓。示例游戏机的轮廓。示例游戏“战场生存记战场生存记” 中就采用点探中就采用点探测的方式进行冲突检测。测的
9、方式进行冲突检测。 1.3 对位图数据进行像素级别对位图数据进行像素级别的冲突检测的冲突检测 方法名称:方法名称:hitTest语法:语法:BitmapData对象对象.hitTest (参数列表参数列表); 提供者:提供者:BitmapData 作用:作用:使用使用BitmapData的的hitTest方法可以检测方法可以检测BitmapData与另与另一个一个Point、Rectangle、Bitmap或者或者BitmapData是否有是否有重叠。它以透明度域值作为有效像素的根据,低于域值的是重叠。它以透明度域值作为有效像素的根据,低于域值的是无效像素,等于或者高于域值的是有效像素,如果两
10、个对象无效像素,等于或者高于域值的是有效像素,如果两个对象比较的区域内有比较的区域内有重叠的有效像素重叠的有效像素,则返回,则返回true,否则返回,否则返回false。 1.3.1 hitTest的使用技巧思路的使用技巧思路hitTest方法给我们提供了一个实现两个可视方法给我们提供了一个实现两个可视对象实体冲突检测的思路。对象实体冲突检测的思路。将游戏中需要进行严格的实体冲突检测的对象制作将游戏中需要进行严格的实体冲突检测的对象制作成带透明通道的位图,导入成带透明通道的位图,导入Flash中使用。中使用。通过通过BitmapData的的draw方法从现有的影片剪辑方法从现有的影片剪辑中获取
11、位图快照,然后再使用中获取位图快照,然后再使用hitTest方法进行冲方法进行冲突检测。突检测。好处:好处:实现真正的与视觉完全一致的冲突检测结果实现真正的与视觉完全一致的冲突检测结果获取动画的位图快照,从而在两个动画之间进行基获取动画的位图快照,从而在两个动画之间进行基于位图的冲突检测,大大提高了冲突检测的真实性。于位图的冲突检测,大大提高了冲突检测的真实性。缺点是运行效率降低了。缺点是运行效率降低了。 1.3.2 hitTest方法的参数方法的参数hitTest有有5个参数,按顺序为:个参数,按顺序为:firstPoint (Point):设定源:设定源BitmapData左上角在比较空间
12、左上角在比较空间中的位置。中的位置。 firstAlphaThreshold (uint):设定源:设定源BitmapData对象被对象被视为不透明的最小视为不透明的最小 Alpha 通道值,取值通道值,取值0255。Alpha值小值小于这个值的像素不参与重叠计算。于这个值的像素不参与重叠计算。secondObject (Object):目标对象,目标对象可以是:目标对象,目标对象可以是Rectangle、Point、Bitmap或或BitmapData对象。对象。secondBitmapDataPoint (Point):可选参数,当目标对:可选参数,当目标对象为象为BitmapData 对
13、象时才使用。表示目标对象左上角在比对象时才使用。表示目标对象左上角在比较空间中的位置。较空间中的位置。 secondAlphaThreshold (uint):可选参数,设定目标:可选参数,设定目标BitmapData 对象被视为不透明的最小对象被视为不透明的最小 Alpha 通道值。通道值。2 基于位图的冲突检测实例基于位图的冲突检测实例 演示程序:小心触电演示程序:小心触电你扮演一个小人物,要穿过到处都是高压电的区域,你扮演一个小人物,要穿过到处都是高压电的区域,你不能碰到任何带电的东西,到达目的地即可获胜。你不能碰到任何带电的东西,到达目的地即可获胜。程序分析:程序分析:很明显,这个游戏
14、的关键技术就是如何精确判断小很明显,这个游戏的关键技术就是如何精确判断小人与众多各种剪辑对象之间是否有重叠的部分,如人与众多各种剪辑对象之间是否有重叠的部分,如果有,则表示触电,游戏失败,如果碰到游戏结束果有,则表示触电,游戏失败,如果碰到游戏结束所在位置的显示对象,表示游戏胜利。所在位置的显示对象,表示游戏胜利。我们单独抽出冲突检测部分进行讲解。我们要完成我们单独抽出冲突检测部分进行讲解。我们要完成的工作是用鼠标引导小人运动,用一个影片剪辑模的工作是用鼠标引导小人运动,用一个影片剪辑模拟带电物体,如果带电物体碰到小人,就输出一条拟带电物体,如果带电物体碰到小人,就输出一条信息。信息。 2.1
15、 设计步骤设计步骤 新建新建Flash文档文档(ActionScript 3.0),设置文档的大小,设置文档的大小为:为:550*200,帧频率为,帧频率为40。设计两个影片剪辑,一个是小人,一个是有三条天线设计两个影片剪辑,一个是小人,一个是有三条天线的带电体,是个会旋转的动画,如下图所示:的带电体,是个会旋转的动画,如下图所示:注意两个剪辑的中心位置都必须定义在左上角,并且注意两个剪辑的中心位置都必须定义在左上角,并且要在剪辑内添加一个透明的方块,用来覆盖动画中可要在剪辑内添加一个透明的方块,用来覆盖动画中可能接触到的区域。如天线剪辑内就有一个这样的方块。能接触到的区域。如天线剪辑内就有一
16、个这样的方块。这样做的目的是为了在任意时刻用这样做的目的是为了在任意时刻用draw方法获得剪辑方法获得剪辑的快照时不会丢失部分动画内容。的快照时不会丢失部分动画内容。 2.2 设计步骤设计步骤将这两个剪辑都布置在舞台上,设置小人的将这两个剪辑都布置在舞台上,设置小人的实例名称为实例名称为boy。进入进入boy剪辑内部,在其第一帧输入如下代剪辑内部,在其第一帧输入如下代码:码:startDrag(true);Mouse.hide(); 这样运行中这个小人将会跟随鼠标移动,并这样运行中这个小人将会跟随鼠标移动,并且鼠标指针被隐藏了。且鼠标指针被隐藏了。 2.3 设计步骤设计步骤进入天线剪辑,在其第
17、一帧输入以下代码:进入天线剪辑,在其第一帧输入以下代码: var enemy:MovieClip=MovieClip(root).boy;addEventListener(Event.ENTER_FRAME,bHitTest);function bHitTest(target:Event) var bd1:BitmapData=new BitmapData(width,height,true,0 x00000000);var bd2:BitmapData=new BitmapData(enemy.width,enemy.height,true,0 x00000000);var pt1:Poin
18、t=new Point(x,y);var pt2:Point=new Point(enemy.x,enemy.y);bd1.draw(this);bd2.draw(enemy);if (bd1.hitTest(pt1,1,bd2,pt2,1) trace(碰到啦碰到啦!); 2.4 设计步骤设计步骤这样天线剪辑就会每过这样天线剪辑就会每过ENTER_FRAME时间就会检查一下是否时间就会检查一下是否与与boy有基于位图的冲突,如果有,就输出信息有基于位图的冲突,如果有,就输出信息“碰到啦碰到啦!”。保存文件,然后测试效果。保存文件,然后测试效果。 用同样的方法进行更多地带电体的设计,以及对用同
19、样的方法进行更多地带电体的设计,以及对boy剪辑进行适剪辑进行适当的改造,就可以实现这个游戏。下图为这个游戏示例的运行截当的改造,就可以实现这个游戏。下图为这个游戏示例的运行截图:图: 2.5 设计步骤设计步骤冲突检测的代码也可以放在冲突检测的代码也可以放在boy剪辑中,但是剪辑中,但是因为可能实际游戏中有很多个这样的带电体,因为可能实际游戏中有很多个这样的带电体,所以将代码放在带电体内部,可以简化代码。所以将代码放在带电体内部,可以简化代码。例如这个例子里,把天线剪辑复制多份在舞台例如这个例子里,把天线剪辑复制多份在舞台上,那么每个天线剪辑实例都能够正确地与上,那么每个天线剪辑实例都能够正确
20、地与boy进行冲突检测。进行冲突检测。 2.6 注意事项注意事项注意:注意:hitTest不支持不支持对对缩放缩放、旋转旋转等变换操等变换操作之后的位图进行冲突检测,它将忽略这些变作之后的位图进行冲突检测,它将忽略这些变换。如果游戏需要这种变换(例如让蝴蝶任意换。如果游戏需要这种变换(例如让蝴蝶任意地飞翔),那么应该将这种缩放、旋转动画地飞翔),那么应该将这种缩放、旋转动画在在剪辑内部实现剪辑内部实现,而不宜在获取位图快照的剪辑,而不宜在获取位图快照的剪辑上进行变换操作。上进行变换操作。 3 “战场生存记战场生存记”中的冲突检测中的冲突检测 “战场生存记战场生存记”中的冲突检测只中的冲突检测只
21、有一个,就是检测炮弹与小兵是有一个,就是检测炮弹与小兵是否有碰到。只要有一个炮弹碰到否有碰到。只要有一个炮弹碰到小兵,小兵就应该死去,游戏结小兵,小兵就应该死去,游戏结束。束。很显然,这个冲突检测应该设计很显然,这个冲突检测应该设计在炮弹角色里面。因为这里炮弹在炮弹角色里面。因为这里炮弹非常小,我们简化设计,将炮弹非常小,我们简化设计,将炮弹当作一个质点,使用点冲突检测当作一个质点,使用点冲突检测来设计,使得检测的边界条件较来设计,使得检测的边界条件较为接近小兵的身体。为接近小兵的身体。 3.1 设计步骤设计步骤 在实验四的基础上修改炮弹角色,使得炮弹角色具有冲突检测功在实验四的基础上修改炮弹
22、角色,使得炮弹角色具有冲突检测功能即可。能即可。打开实验四时制作的打开实验四时制作的fla文档,在库中找到炮弹剪辑,双击进入剪文档,在库中找到炮弹剪辑,双击进入剪辑内部。在第一帧的代码部分做如下修改:辑内部。在第一帧的代码部分做如下修改:将将repeat函数修改为:函数修改为:function repeat(Event) moveBall();/炮弹的运动炮弹的运动var deadHero = checkBomb();/检查是否碰到敌人检查是否碰到敌人if (deadHero != null) /碰到敌人了碰到敌人了gotoAndPlay(bomb);/自身爆炸自身爆炸deadHero.dea
23、d();/指示敌人死去指示敌人死去 这样炮弹在这样炮弹在repeat时不仅运动,还将检测它是否碰到敌人。如果时不仅运动,还将检测它是否碰到敌人。如果碰到,就指示这个敌人死去。这里引用了碰到,就指示这个敌人死去。这里引用了deadHero的的dead方法,方法,也就是前面设计的小兵角色的也就是前面设计的小兵角色的dead方法。方法。 3.2 设计步骤设计步骤编写编写checkBomb函数以便完成碰撞检测。函数以便完成碰撞检测。function checkBomb():MovieClip /检查是否与敌人列表中的一个敌人相检查是否与敌人列表中的一个敌人相碰撞碰撞for (var i = 0; ienemy.length; i+) if (enemyi=null) continue;if (enemyi.hitTestPoint(this.x, this.y, true) & enemyi.status != dead) /碰到敌人,并且敌人还没有死碰到敌人,并且敌人还没有死return enemyi;return null; 显然,这个函数用来确认炮弹是否碰到它的敌人。如显然,这个函数用来确认炮弹是否碰到它的敌人。如果有,则返回敌人的名称索引,否则返回果有,则返回敌人的名称索引,否则返回null。 3.3 设
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度专利申请合同格式:专利申请项目知识产权保护协议2篇
- 二零二五年度家具租赁经营合同样本3篇
- 万孔锚具建议书可行性研究报告备案
- 正丁基锂建设项目可行性研究报告申请立项备案
- 甘肃省天水市(2024年-2025年小学六年级语文)部编版期末考试((上下)学期)试卷及答案
- 2025年度O2O在线教育平台与实体学校合作协议3篇
- 机场改造项目初步设计
- 二零二五年度房屋抵押贷款续贷合同范本封面2篇
- 二零二五年度多子女共同抚养离婚协议模板2篇
- 陕西省年储藏销售一万吨果品项目申请报告
- taft波完整版可编辑
- 2023-2024学年浙江省富阳市小学数学五年级上册期末通关试题
- TTAF 092-2022 移动终端融合快速充电测试方法
- GB/T 9410-2008移动通信天线通用技术规范
- GB/T 5343.2-2007可转位车刀及刀夹第2部分:可转位车刀型式尺寸和技术条件
- GB/T 32285-2015热轧H型钢桩
- GB/T 13772.2-1992机织物中纱线抗滑移性测定方法模拟缝合法
- SVG运行与维护课件
- 企业大学商学院建设方案
- 部编人教版 六年级下册道德与法治课堂作业(含答案)
- 幼儿园大班数学:《长颈鹿的水果店》 课件
评论
0/150
提交评论