资源描述
ActionScript 编程 简单碰撞检测作用: 检测影片中各种对象在运动时发生的碰撞,并执行相应的指令。说明: 碰撞检测是虚拟物体之间交互作用的基础,是动画制作中最基本 的问题。在 2D 动画中,可以将碰撞检测视为两个平面几何体之间相交 的判断。在 Flash 和 ActionScript 中,判断物体是否碰撞有两种方法, 即判断对象与点的碰撞以及对象与对象的碰撞。1对象与对象的碰撞显示对象(DisplayObject)类提供了 hitTestObject()方法来检测对 象与对象的碰撞,并返回一个逻辑(Boolean)型数据,实现碰撞结果 的判断,如下所示。DisplayObjectl.hitTestObject(DisplayObject2)在上面的代码中,DisplayObjectl和DisplayObject2均为需要进行 碰撞检测的显示对象。当两个对象发生碰撞时,上面的代码将返回true, 否则,则返回false。为保证碰撞检测的即时型,通常需要将碰撞检测 放到时间轴事件中,随帧的播放而执行。2对象与点的碰撞除了对象和对象的碰撞外,ActionScript还允许用户对对象和点的 碰撞进行检测。这就需要使用显示对象(DisplayObject)类的 hitTestPoint()方法,通过设置hitTestPoint()方法的3个参数,决定碰撞 对象时是否使用形状检测,如下所示。DisplayObject.hitTestPoint(x,y,ShapeFlag); 在上面的代码中,各关键词的含义如下所示。 DisplayObject需要进行碰撞检测的对象 x碰撞点的水平坐标 y 碰撞点的垂直坐标 ShapeFlag 判断碰撞检测的显示对象类型。x 和 y 参数指定舞台的坐标空间中的点,而不是包含显示对象的显示对象容器中的点,除非显示对象容器是舞台。当设置 ShapeFlag 参数为true时,碰撞检测将检测对象的实际像素,而其参数为false时, 则检测对象的边框像素。示例:例如,在舞台中分别创建实例名称为“mcl”和“mc2”的影片剪 辑元件,这两个元件可为任意形状。然后,使用hitTestObject()方法检 测这两个元件是否发生碰撞,代码如下所示。mcl.addEventListener(MouseEvent.MOUSE_DOWN,startdrag);使在mc1实例上按下鼠标即可拖动该实例mc1.addEventListener(MouseEvent.MOUSE_UP,stopdrag);使在mc1实例上放开鼠标即可拖动该实例function startdrag(event:MouseEvent):voidevent.target.startDrag(); 开始拖动function stopdrag(event:MouseEvent):voidevent.target.stopDrag(); 停止拖动 addEventListener(Event.ENTER_FRAME,checkhit);处理侦听enterFrame事件,并调用checkhit()函数function checkhit(event:Event):voidif (mc1.hitTestObject(mc2)测试mc1实例和mc2实例是否发生碰撞trace(发生碰撞);elsetrace(没有碰撞);在上面的代码中,使用Event类中的target属性用来指定事件目标, 即mc1实例。当对mc1实例触发鼠标按下事件时,Sprite类的startDrag() 方法将允许用户拖动指定的 mc1 实例,该实例将一直保持可拖动,直 到通过调用stopDrag()方法来停止;当对mc1实例触发鼠标放开事件时,调用stopDrag()方法来结束startDrag()方法,即停止拖动。使用hitTestPoint()方法可以方便地检测对象是否和某个点发生碰 撞。例如,在舞台中创建一个实例名称为“me”的不规则圆形(缺少 一部分)以及用来显示结果的txt动态文本,然后使用hitTestPoint()方 法检测鼠标光标是否与该对象发生碰撞,以及可发生碰撞的范围,代 码如下所示。var flag:Boolean;指示是否使用形状检测stage.addEventListener(MouseEvent.CLICK,shapeflag);处理侦听鼠标单击事件,并调用shapeflag()函数this.addEventListener(Event.ENTER_FRAME,checkhit);处理侦听enterFrame事件,并调用checkhit()函数function shapeflag(event:MouseEvent):voidflag=!flag; 切换检测方式function checkhit(event:Event):voidif(mc.hitTestPoint(this.mouseX,this.mouseYflag)检测鼠标光标是否在mc实例中txt.text=发生碰撞;elsetxt.text=没有碰撞;运行上面的代码,把鼠标移向me实例的缺口处,可以发现鼠标与 圆形边框的实际像素层叠或相交时即发生碰撞;而在舞台上单击鼠标 后,再把鼠标移向mc实例的缺口处,可以发现只有与圆形的实际像素 层叠或相交时才发生碰撞。
展开阅读全文