Flash游戏中碰撞检测方法的与实现

点赞:3850 浏览:9908 近期更新时间:2024-02-07 作者:网友分享原创网站原创

摘 要:论文对Flash游戏、碰撞检测算法进行了介绍,并研究了如何在Flash中实现碰撞检测的两种方法,一种是采用Flashaction提供的hitTest方法,另一种是采用经典的空间剖分方法,并进行了实验以验证两种方法.

关 键 词:碰撞检测;hitTest;空间剖分法,Flash

中图分类号:TP399文献标识码:A文章编号:1009-3044(2012)10-2369-03

TheCollisionDetectionMethodResearchandRealizationinFlashGame

LILi-hua,LULing,ZHANGLi-lei

(EastChinaInstituteofTechnology,InformationEngineeringCollege,Fuzhou344000,China)

Abstract:ThisarticleintroducedontheFlashgame,collisiondetectionalgorithm,andstudytwokindsofmethodsonhowtoachievethecollisiondetectioninFlash,thefirstisusingthehitTestmethodinFlashaction,andanotheristheclassicspacepartitionmethod,atlastgivingtheexperimentstovalidatethetwomethods.

Keywords:collisiondetection,hitTest,spatialdepositionmethod,,Flash

1Flash游戏现状

随着网络技术的发展、计算机动画技术条件的日趋成熟,网络动画得到了蓬勃的发展,其中以Flash动画的发展尤为迅速.Flash软件不仅可以实现多种动画特效、它在游戏方面的设计与制作的优点更是很突出.利用Flash的动画技术制作的游戏容量非常小,在网络

上非常容易传播,再加上强大的ActionScript能够制作出可玩性很强的小游戏[1].

Flash游戏也和采用其他技术制作的游戏一样,需要对游戏中角色进行控制,在角色进行移动的过程中,角色与角色,角色与物体之间可能会发生碰撞,该文所要研究的就是在Flash游戏中,在各个元素在移动的过程中,检测可能发生的碰撞,以避免角色与角色,物体与物体,角色与物体之间的穿透现象的发生.

2碰撞检测算法简介

碰撞检测问题来源于现实生活中一个普遍存在的事实:两个不可穿透的对象不可能共享相同的空间区域.碰撞检测算法从时间域的角度,可分为静态碰撞检测算法、离散碰撞检测算法和连续碰撞检测算法三类,从空间域的角度,可以分为基于实体空间的碰撞检测算法和基于图像空间的碰撞检测算法[2].

对于基于实体空间的算法,根据所表示实体的模型不同又可以分为两类:空间剖分法和层次包围盒法.这两种算法都是通过最大限度地减少需要进行相交测试的物体对或基本几何元素对的数目来加速碰撞检测的过程[3].空间剖分法,根据剖分方法的不同可分为均匀剖分、八叉树、BSP树等,层次包围盒法可以分为包围球(sphere)、轴向包围盒(AABB)、方向包围盒(oBB)、离散方向多面体(k-dop)等.

Flash游戏中碰撞检测方法的与实现参考属性评定
有关论文范文主题研究: 关于物体的论文范文数据库 大学生适用: 专科论文、本科毕业论文
相关参考文献下载数量: 30 写作解决问题: 学术论文怎么写
毕业论文开题报告: 标准论文格式、论文结论 职称论文适用: 职称评定、职称评中级
所属大学生专业类别: 学术论文怎么写 论文题目推荐度: 优质选题

目前,存在的碰撞检测算法种类繁多,应该根据具体的需求,选用不同的技术.因为随着应用场合的改变,对实时性、精确性和完整性的要求也会随之改变.对于具体技术的选择除了要考虑到算法本身的复杂性、可靠性和效率外,还需要考虑到不同算法的特点和所面向的对象.

该文所要研究的是在Flash小游戏中实现碰撞检测的方法.

3Flash游戏简单碰撞检测

当Flash场景中的角色与物体都不是很多时,可以采用把物体与角色所对应的元件实例两两依次进行碰撞检测,实际的实现可以采用hitTest方法来实现[4].

3.1hitTest方法实现碰撞检测

hitTest是用来检测两个物体或目标是否重叠和相交,如果相交或重叠,就执行相应的动作.如果发生相交则返回true,否则返回false.

hitTest方法有两种用法:1)与某点相交的情况,语法格式如下:MC.hitTest(x,y,true或false),这种情况下用于检测MC是否与括号中的x,y所确定的点(x,y)相交.第三个参数如果取值为true,那么将根据MC这个元件实例的实际图形范围进行碰撞检测,如果取值为false则通过MC的外框检测是否与(x,y)相交.

图1hitTest方法

以图1为例,检测设该不规则多边形的元件实例名为MC,则MC.hitTest(200,100,true)将会检测此多边形所绘制的区域是否与点(200,100)发生碰撞,此时返回值为false,而采用MC.hitTest(200,100,false)则是检测改元件的外框即图中蓝色线所标志的区域是否与点(200,100)发生碰撞,此时的返回值为true.

2)元件实例与元件实例间的相交:MC.hitTest(另一MC)..其中MC是指一个元件实例的名称.如果其返回值为true,说明两个元件实例间发生了碰撞,如果返回值为False,说明两个元件实例没有发生碰撞.

检测设主舞台上有两个小球元件,实例名分别为mca和mcb,要检测这两个元件之间是否发生了碰撞,则可以采用以下方式实现:

if(_root.mca.hitTest(_root.mcb))

{//发生碰撞后的处理代码

}

图2两个元件之间的碰撞检测

如图2所示,第一组小球中,两个元件实例的外框发生了交叉,所以两个元件实例发生了碰撞,则_root.mca.hitTest(_root.mcb)的返回值为true,第二组小球中,两个元件实例之间的外框没有发生交叉,所以两个元件实例没有发生碰撞,则_root.mca.hitTest(_root.mcb)的返回值为false.

3.2Flash游戏中空间剖分法碰撞检测算法的设计与实现

1)空间剖分法原理:把整个空间分成不同的区域,然后根据物体所在区域的信息来确定物体之间是否可能会发生碰撞.最普遍应用的一种就是空间均匀剖分法.

2)Flash中地图的划分:采用均匀剖分法把整个Flash场景的地图进行划分.采用二维数组存储地图的初始信息,包含一些不动的物体的初始的存放位置信息.

图3地图的初始化

如图所示的这种情况,可以让声明一个名称为ditu的数组,保存初始的地图信息值如下

[0,0,0,0,0]

[1,0,0,1,0]

[0,0,0,0,0]

[0,0,1,0,0]

这样就把地图采用空间剖分法分成了很多小块.

3)算法的实现:首先保存可能会运动的物体的初始位置信息,随着物体的运动,随时刷新地图的信息,如果同一块地图上出现了两个物体,那么说明此时发生了碰撞.然后再对碰撞进行处理.这样就不需要对场景上所有的物体进行一一成对的检测了.

检测设地图上有物体A和B,如图4a)所示.

a)初始情况

b)物体发生了运动的情况

图4有可运动物体的地图

此时可刷新ditu数组的信息为:

[0,0,0,0,0]

[1,0,0,1,0]

[0,0,0,0,1]

[1,0,1,0,0]

A、B物体发生运动后,其位置信息会发生改变,随着位置的改变,同时刷新ditu数组的信息.如图4b)所示

[0,0,0,0,0]

[1,0,0,2,0]

[0,1,0,0,1]

[0,0,1,0,0]

当检测到数组中有一个元素的值为2时,说明发生了碰撞,如图4b)所示,B物体与初始地图上的物体发生了碰撞,此时可以让物体B退到原来的位置以进行后续处理.

4结束语

Flash游戏一开始是作为对大型网游和小型联网休闲游戏的补充而占据了一席之地.在Flash游戏发展尤为迅速的现代,Flash游戏中对碰撞的检测方法和处理方法的研究具有一定的实际意义,在以后的研究中,可以考虑将更多的经典碰撞检测算法应用到Flash游戏中并根据实际情况对其分析改进.