-游戏中的冲突检测_第1页
-游戏中的冲突检测_第2页
-游戏中的冲突检测_第3页
-游戏中的冲突检测_第4页
-游戏中的冲突检测_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

1、校际选修课闽江学院教案课程名称?Flash游戏编程?任课老师:肖刚第七章游戏中的冲突检测教学提要冲突检测的方法介绍基于位图的冲突检测实例“战场生存记中的冲突检测 重点与难点冲突检测的边际条件冲突检测技术与延迟循环的综合应用教学内容:冲突检测是指检测两个对象是否有重叠的局部或者某个对象是否覆盖了某个点.许多游戏必须使用到冲突检测,例如:搏斗游戏,两个对战角色是否相碰是出招是否有效的前提.再比方台球游戏,如果台球在运动的过程中相碰,那么它应该有动量传递.正确地进行冲突检测,是这些游戏设计成败的关键点.一、冲突检测的方法介绍ActionScript给我们提供了三种冲突检测的方法.列表如下:名称描述提

2、供者hitTestObject目标显示对象检测两个对象是否有重DisplayObject叠的局部hitTestPointx,y,形状标记检测本对象是否覆盖了DisplayObject某个点hitTest参数列表检测两个 BitmapData是BitmapData否有重叠的局部现分别介绍如下:1、检测两个显示对象是否有重叠的局部使用显示对象的hitTestObject方法可以检测两个显示对象是否有重叠的局部.其语法如 下:源显示对象.hitTestObject目标显示对象;它的返回值true表示有重叠,false表示没有重叠.但需要注意的是,这个函数以显示对象的外接矩形框作为评判是否重叠的依据.

3、两个显示对象图像局部重叠当然好理解,但是如以下图中的两个影片剪辑矩形框是外接矩形区域示意图,在视觉上虽然没有重叠,但是由于它们的矩形框区域有交叉的局部,所以hitTestObject的返回值为true.外接矩形框示意图还有一个细节需要注意,如果影片剪辑在编辑过程中,或者是运行过程中有旋转,那么此时 的情况会如何呢?例如上图中的五角星,如果旋转了一个某个角度,如以下图所示:校际选修课闽江学院教案课程名称?Flash游戏编程?任课老师:肖刚旋转后的外接矩形框示意图那么,进行冲突检测的时候,采用剪辑原有的方框实线,还是大虚线方框,抑或是小虚线方框?实验结果说明,Flash采用的是大虚线方框作为冲突检

4、测的矩形区域.2、检测显示对象与某一点是否重叠使用显示对象的hitTestPoint方法可以检测显示对象与某个坐标点是否重叠.形状标记为false默认时,使用显示对象的外接矢I形框作为判断的依据,为 true时,使用显示对象的 实体像素作为判断的依据与坐标点进行检测.其语法如下: 显示对象.hitTestPointx,y,形状标记;可选参数默认值是false,它表示使用边框作为判断的依据.参数x和参数y指出了场景中的一个坐标,当形状标记值为true的时候,那么判断显示对象的实际形状与指定的作标点是否冲突,当形状标记为false的时候,那么判断显示对象的矩形形状区域与指定的作标点是否冲突.如以下

5、图所示,J A4显示对象的点冲突检测五角星剪辑和三个坐标点A、B、C在形状标记不同取值下hitTestPoint的返回值如下表:形状标记truefalseAfalsetrueBtruetrueCfalsefalse提示:大多数游戏中,将尺寸较小的剪辑简化为点,用hitTestPoint检测它与某个对象是否冲突.例如战斗机游戏中,所有的子弹都被简化成质点.这显著提升了游戏的性能,也使爆炸点更贴近战斗机的轮廓.例如“战场生存记游戏中就采用点探测的方式实现冲突检测. 3、对位图数据进行像素级别的冲突检测使用 BitmapData 的 hitTest方法可以检测 BitmapData 与另一个 Poi

6、nt、Rectangle、Bitmap 或者BitmapData是否有重叠.它以透明度域值作为有效像素的根据,低于域值的是无效像 素,等于或者高于域值的是有效像素,如果两个对象比拟的区域内有重叠的有效像素,那么返回true,否那么返回false.这给我们提供了一个实现两个可视对象实体冲突检测的思路.即将游戏中需要进行严格的实体冲突检测的对象制作成带透明通道的位图,导入Flash中使用,或者是通过BitmapData的draw方法从现有的影片剪辑中获取位图快照,然后再使用hitTest方法进行冲突检测.这样做的好处是可以实现真正的与视觉完全一致的冲突检测结果.使用draw方法还有一个好处,就是可

7、以获取动画的位图快照,从而在两个动画之间进行基于位图的冲突检测,大大提闽江学院教案校际选修课课程名称?Flash游戏编程?任课老师: 色幽高了冲突检测的真实性.hitTest有5个参数,按顺序为:1) firstPoint (Point):设定源 BitmapData左上角在比拟空间中的位置.2) firstAlphaThreshold (uint):设定源 BitmapData对象被视为不透明的最小Alpha通道值,取值0255.Alpha值小于这个值的像素不参与重叠计算.3) secondObject (Object):目标对象,目标对象可以是Rectangle、Point、Bitmap

8、或BitmapData 对象.4) secondBitmapDataPoint (Point):可选参数,当目标对象为 BitmapData对象时才使用. 表示目标对象左上角在比拟空间中的位置.5) secondAlphaThreshold (uint):可选参数,设定目标 BitmapData对象被视为不透明的 最小Alpha通道值.注意:hitTest不支持对缩放、旋转等变换操作之后的位图进行冲突检测,它将忽略这些变换.如果游戏需要这种变换例如让蝴蝶任意地飞翔 ,那么应该将这种缩放、旋转动画在剪辑内部实现,而不宜在获取位图快照的剪辑上进行变换操作.二、基于位图的冲突检测实例演示程序:小心触

9、电你扮演一个小人物,要穿过到处都是高压电的区域,你不能碰到任何带电的东西,到达目的地即可获胜.程序分析:很明显,这个游戏的关键技术就是如何精确判断小人与众多各种剪辑对象之间是否有重 叠的局部,如果有,那么表示触电失败,如果碰到游戏结束所在位置的显示对象,表示游戏胜 利.我们单独抽出冲突检测局部进行讲解.我们要完成的工作是用鼠标引导小人运动,用一个影片剪辑模拟带电物体,如果带电物体碰到小人,就输出一条信息.设计步骤:1)新建Flash文档(ActionScript 3.0),设置文档的大小为:550*200,帧频率为 40.2)设计两个影片剪辑,一个是小人,一个是有三条天线的带电体,是个会旋转的

10、动画,如以下图所示:注意两个剪辑的中央位置都必须定义在左上角,并且要在剪辑内添加一个透明的方块,用来覆盖动画中可能接触到的区域.如天线剪辑内就有一个这样的方块.这样做的目的是为了在任意时刻用draw方法获得剪辑的快照时不会丧失局部动画内容.3)将这两个剪辑都布置在舞台上,设置小人的实例名称为 boy.4)进入boy剪辑内部,在其第一帧输入如下代码:startDrag(true);Mouse.hide();这样运行中这个小人将会跟随鼠标移动,并且鼠标指针被隐藏了.5)进入天线剪辑,在其第一帧输入以下代码:var enemy:MovieClip=MovieClip(root).boy;闽江学院教案

11、校际选修课 课程名称?Flash游戏编程?任课老师:肖刚addEventListener(Event.ENTER_FRAME,bHitTest); function bHitTest(target:Event) var bd1:BitmapData=new BitmapData(width,height,true,0x00000000);var bd2:BitmapData=new BitmapData(enemy.width,enemy.height,true,0x00000000);var pt1:Point=new Point(x,y);var pt2:Point=new Point(e

12、nemy.x,enemy.y);bd1.draw(this);var rec:Rectangle=new Rectangle(-50,-10,100,200);bd2.draw(enemy);if (bd1.hitTest(pt1,1,bd2,pt2,1) trace(碰到啦!);这样天线剪辑就会每过ENTER_FRAME时间就会检查一下是否与boy有基于位图的冲突,如果有,就输出信息“碰到啦!!.冲突检测的代码也可以放在boy剪辑中,但是由于可能实际游戏中有很多个这样的带电体,所以将代码放在带电体内部,可以简化代码.例如这个例子里,把天线剪辑复制多份在舞台上,那么每个天线剪辑实例都能够正确地

13、与boy进行冲突检测.6)保存文件,然后测试效果.7)用同样的方法进行更多地带电体的设计,以及对 boy剪辑进行适当的改造,就可以实现 这个游戏.以下图为这个游戏例如的运行截图:三、“战场生存记中的冲突检测“战场生存记中的冲突检测只有一个, 就是检测炮弹与小兵是否有碰到.只要有一个炮打碰到小兵,小兵就应该死去,游戏结束.很显然,这个冲突检测应该设计在炮弹角色里面.由于这里炮弹非常小,我们简化设计,将炮弹当作一个质点,使用点冲突检测来设计,使得检测的边界条件较为接近小兵的身体.校际选修课闽江学院教案课程名称?Flash游戏编程?任课老师:肖刚设计步骤:在实验四的根底上修改炮弹角色,使得炮弹角色具

14、有冲突检测功能即可.翻开实验四时制作的fla文档,在库中找到炮弹剪辑,双击进入剪辑内部.在第一帧的代码局部做如下修改: 1)将repeat函数修改为:function repeat(Event) moveBall();/炮弹的运动var deadHero = checkBomb();/ 检查是否碰到敌人if (deadHero != null) / 碰到敌人了gotoAndPlay(bomb);/ 自身爆炸 deadHero.dead();/指示敌人死去 这样炮弹在repeat时不仅运动,还将检测它是否碰到敌人.如果碰到,就指示这个敌人 死去.这里引用了 deadHero的dead方法,也就是

15、前面设计的小兵角色的dead方法.这是直接调用另一个角色的方法的例如.但是事实上如果是构建一个复杂的应用系统,那么不应该直接调用其它对象的方法,否那么相当于炮弹的任何敌人必须有dead方法,提升了模块之间的耦合度.改用自定义事件那么可以解决这个问题.代码如下:function repeat(e:Event) moveBall();/炮弹的运动var deadHero = checkBomb();/ 检查是否碰到敌人if (deadHero != null) / 碰到敌人了gotoAndPlay(bomb);/ 自身爆炸 var e:Event=new Event(bomb); this.dis

16、patchEvent(e);闽江学院教案校际选修课课程名称?Flash游戏编程?任课老师:色也)这样只要它碰到敌人就会发出bomb事件,至于如何响应这个事件,就交给使用角色的代码来完成了,这大大提升了模块的独立性.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)设计enemy数组.由于炮弹角色可能被用户多人游戏,也就是它的敌人数可能不止一个.所以这里用一个数组 enemy来存储它的敌人名称索引.然后再提供setEmemy函数来给炮弹添加敌人.代码如下:var enemy:Array;function setEnemy(enemyName:MovieClip) / 注册敌人if (enemy=null) enemy=

温馨提示

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

评论

0/150

提交评论