阳光VIP

少壮不努力,老大徒伤悲。平日弗用功,自到临期悔。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Flash游戏学习笔记:矩形检测碰撞

Posted on 2012-02-17 20:10  阳光VIP  阅读(175)  评论(0编辑  收藏  举报
 
getBounds(targetCoordinateSpace:DisplayObject):Rectangle
返回一个矩形,该矩形定义相对于 targetCoordinateSpace 对象坐标系的显示对象区域。

 

getRect(targetCoordinateSpace:DisplayObject):Rectangle
返回一个矩形,该矩形根据 targetCoordinateSpace 参数定义的坐标系定义显示对象的边界,但不包括形状上的任何笔触。
 
  Rectangle Rectangle 对象是按其位置(由它左上角的点 (x, y) 确定)以及宽度和高度定义的区域。
 
我们使用这个Rectangle 类进行一次简单检测碰撞,利用矩形是否相交的方法来检测两个对象是否相交 从而产生一些简单碰撞删除。
 
看看下面的代码:
在场景上放了随意两个影片剪辑,分别b1 和b2  在它的属性里面分别写上b1,b2
  1. package 
  2. {    //碰撞检测方法
  3.     import flash.display.MovieClip;
  4.     import flash.events.*;
  5.     import flash.geom.Rectangle;
  6.     import flash.geom.Point;
  7.     public class Example extends MovieClip
  8.     {
  9.         private var point:Point;
  10.         private var rect:Rectangle;
  11.         public function Example()
  12.         {
  13.             init();
  14.         }
  15.         private function init():void
  16.         {
  17.             rect=b1.getRect(stage);
  18.             trace( rect);
  19.             b2.addEventListener(MouseEvent.MOUSE_DOWN,move);
  20.             stage.addEventListener(MouseEvent.MOUSE_UP,onup);
  21.             b2.addEventListener(Event.ENTER_FRAME,Run);
  22.         }
  23.         private function move(e:MouseEvent):void
  24.         {
  25.             point=new Point(e.target.mouseX,e.target.mouseY);
  26.         }
  27.         private function onup(e:MouseEvent):void
  28.         {
  29.             point=null;
  30.         }
  31.         private function Run(e:Event):void
  32.         {
  33.             if (point!=null)
  34.             {
  35.                 e.target.x=mouseX-point.x; //拖动b2
  36.                 e.target.y=mouseY-point.y;
  37.                 var rect2:Rectangle=b2.getRect(stage);
  38.                 trace( rect2);
  39.                 if (rect2.intersects(rect))
  40.                 {
  41.                     trace("你碰撞了我");
  42.                 }
  43.             }
  44.         }
  45.     }
  46. }

第一步:我们使用了DisplayObject 类的getRect()方法返回矩形对象。

第二步:同样返回 第二个图形的矩形对象;

 

第三步:我们进行拖动,将两个物体进行叠加看看是否会发生监测碰撞,

 

  1.  if (rect2.intersects(rect))
  2.                 {
  3.                     trace("你碰撞了我");
  4.                 }
  5. 如果rect2.intersects(rect)) 真的就返回 true,并输出碰撞信息
  6. 否则不发生碰撞,用这种矩形检测碰撞是一个简单检测碰撞方法。注意:但是对于不规则的图形就不太适合了。

 

第二段代码:

 

  1. package 
  2. {
  3.     import flash.display.MovieClip;
  4.     import flash.events.*;
  5.     import flash.geom.Rectangle;
  6.     import flash.geom.Point;
  7.     import flash.utils.Timer;
  8.     public class Example extends MovieClip
  9.     {
  10.         private var point:Point;
  11.         //private var rect:Rectangle;
  12.         private var rect2:Rectangle;
  13.         public function Example()
  14.         {
  15.             init();
  16.         }
  17.         private function init():void
  18.         {
  19.             var time:Timer=new Timer(1000);
  20.             time.addEventListener(TimerEvent.TIMER,TimeRun);
  21.             time.start();
  22.             b2.addEventListener(MouseEvent.MOUSE_DOWN,move);
  23.             stage.addEventListener(MouseEvent.MOUSE_UP,onup);
  24.             b2.addEventListener(Event.ENTER_FRAME,Run);
  25.         }
  26.         private function TimeRun(e:TimerEvent):void
  27.         {
  28.             var ball:Ball=new Ball();//库链接
  29.             addChild(ball);
  30.             ball.x=Math.random()*500;
  31.             ball.addEventListener(Event.ENTER_FRAME,Runing);
  32.         }
  33.         private function Runing(e:Event):void
  34.         {
  35.             var mc:MovieClip=e.currentTarget as MovieClip;
  36.             mc.y+=5;
  37.             trace(mc.name);
  38.             var rect:Rectangle=new Rectangle(mc.x,
  39.              mc.y,
  40.              mc.width,
  41.              mc.height);
  42.             trace(rect);
  43.             if (rect2.intersects(rect))
  44.             {
  45.                 trace("你碰撞了我");
  46.                 mc.parent.removeChild(mc);
  47.                 mc=null;
  48.             }
  49.         }
  50.         private function move(e:MouseEvent):void
  51.         {
  52.             point=new Point(e.target.mouseX,e.target.mouseY);
  53.         }
  54.         private function onup(e:MouseEvent):void
  55.         {
  56.             point=null;
  57.         }
  58.         private function Run(e:Event):void
  59.         {
  60.             rect2=b2.getBounds(stage);
  61.             if (point!=null)
  62.             {
  63.                 e.target.x=mouseX-point.x;
  64.                 e.target.y=mouseY-point.y;
  65.             }
  66.         }
  67.     }
  68. }

 

 

 

根据上面的方法:这里做了一个测试,在库链接添加一个Ball类,通过Timer 函数来每隔一秒产生一个对象,并进行向下运动。通过鼠标拖动对象b2 ,看看和这些复制的对象产生碰撞,如果碰撞了就马上删除了。通过这个实现一些简单的碰撞检测还是很有效果的。而且效率比较高。

 

 

 

扩展:上面可以实现一些简单接金币游戏。