您的位置:首页 > 其它

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

2009-01-05 19:03 671 查看
getBounds(targetCoordinateSpace:DisplayObject):Rectangle
返回一个矩形,该矩形定义相对于 targetCoordinateSpace 对象坐标系的显示对象区域。
getRect(targetCoordinateSpace:DisplayObject):Rectangle
返回一个矩形,该矩形根据 targetCoordinateSpace 参数定义的坐标系定义显示对象的边界,但不包括形状上的任何笔触。


RectangleRectangle 对象是按其位置(由它左上角的点 (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 ,看看和这些复制的对象产生碰撞,如果碰撞了就马上删除了。通过这个实现一些简单的碰撞检测还是很有效果的。而且效率比较高。



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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: