getBounds(targetCoordinateSpace:DisplayObject):Rectangle 返回一个矩形,该矩形定义相对于 targetCoordinateSpace 对象坐标系的显示对象区域。 |
getRect(targetCoordinateSpace:DisplayObject):Rectangle
返回一个矩形,该矩形根据 targetCoordinateSpace 参数定义的坐标系定义显示对象的边界,但不包括形状上的任何笔触。
Rectangle | Rectangle 对象是按其位置(由它左上角的点 (x, y) 确定)以及宽度和高度定义的区域。 |
我们使用这个Rectangle 类进行一次简单检测碰撞,利用矩形是否相交的方法来检测两个对象是否相交 从而产生一些简单碰撞删除。
看看下面的代码:
在场景上放了随意两个影片剪辑,分别b1 和b2 在它的属性里面分别写上b1,b2
- package
- { //碰撞检测方法
- import flash.display.MovieClip;
- import flash.events.*;
- import flash.geom.Rectangle;
- import flash.geom.Point;
- public class Example extends MovieClip
- {
- private var point:Point;
- private var rect:Rectangle;
- public function Example()
- {
- init();
- }
- private function init():void
- {
- rect=b1.getRect(stage);
- trace( rect);
- b2.addEventListener(MouseEvent.MOUSE_DOWN,move);
- stage.addEventListener(MouseEvent.MOUSE_UP,onup);
- b2.addEventListener(Event.ENTER_FRAME,Run);
- }
- private function move(e:MouseEvent):void
- {
- point=new Point(e.target.mouseX,e.target.mouseY);
- }
- private function onup(e:MouseEvent):void
- {
- point=null;
- }
- private function Run(e:Event):void
- {
- if (point!=null)
- {
- e.target.x=mouseX-point.x; //拖动b2
- e.target.y=mouseY-point.y;
- var rect2:Rectangle=b2.getRect(stage);
- trace( rect2);
- if (rect2.intersects(rect))
- {
- trace("你碰撞了我");
- }
- }
- }
- }
- }
第一步:我们使用了DisplayObject 类的getRect()方法返回矩形对象。
第二步:同样返回 第二个图形的矩形对象;
第三步:我们进行拖动,将两个物体进行叠加看看是否会发生监测碰撞,
- if (rect2.intersects(rect))
- {
- trace("你碰撞了我");
- }
- 如果rect2.intersects(rect)) 真的就返回 true,并输出碰撞信息
- 否则不发生碰撞,用这种矩形检测碰撞是一个简单检测碰撞方法。注意:但是对于不规则的图形就不太适合了。
第二段代码:
- package
- {
- import flash.display.MovieClip;
- import flash.events.*;
- import flash.geom.Rectangle;
- import flash.geom.Point;
- import flash.utils.Timer;
- public class Example extends MovieClip
- {
- private var point:Point;
- //private var rect:Rectangle;
- private var rect2:Rectangle;
- public function Example()
- {
- init();
- }
- private function init():void
- {
- var time:Timer=new Timer(1000);
- time.addEventListener(TimerEvent.TIMER,TimeRun);
- time.start();
- b2.addEventListener(MouseEvent.MOUSE_DOWN,move);
- stage.addEventListener(MouseEvent.MOUSE_UP,onup);
- b2.addEventListener(Event.ENTER_FRAME,Run);
- }
- private function TimeRun(e:TimerEvent):void
- {
- var ball:Ball=new Ball();//库链接
- addChild(ball);
- ball.x=Math.random()*500;
- ball.addEventListener(Event.ENTER_FRAME,Runing);
- }
- private function Runing(e:Event):void
- {
- var mc:MovieClip=e.currentTarget as MovieClip;
- mc.y+=5;
- trace(mc.name);
- var rect:Rectangle=new Rectangle(mc.x,
- mc.y,
- mc.width,
- mc.height);
- trace(rect);
- if (rect2.intersects(rect))
- {
- trace("你碰撞了我");
- mc.parent.removeChild(mc);
- mc=null;
- }
- }
- private function move(e:MouseEvent):void
- {
- point=new Point(e.target.mouseX,e.target.mouseY);
- }
- private function onup(e:MouseEvent):void
- {
- point=null;
- }
- private function Run(e:Event):void
- {
- rect2=b2.getBounds(stage);
- if (point!=null)
- {
- e.target.x=mouseX-point.x;
- e.target.y=mouseY-point.y;
- }
- }
- }
- }
根据上面的方法:这里做了一个测试,在库链接添加一个Ball类,通过Timer 函数来每隔一秒产生一个对象,并进行向下运动。通过鼠标拖动对象b2 ,看看和这些复制的对象产生碰撞,如果碰撞了就马上删除了。通过这个实现一些简单的碰撞检测还是很有效果的。而且效率比较高。