box2d中的刚体碰撞都是自行处理的无需开发者另行判断碰撞,但有时候我们需要在刚体碰撞时加入一些效果,如发声,或是改变刚体对应的显示对象的状态等,那又如何呢?
box2d中有个b2ContactListener类,此类提供了4个方法来处理刚体碰撞时的四中情况,分别是:
/// Called when a contact point is added. This includes the geometry
/// and the forces.
public virtual function Add(point:b2ContactPoint) : void{};
当有刚体接触时调用Add方法,point是接触点。
/// Called when a contact point persists. This includes the geometry
/// and the forces.
public virtual function Persist(point:b2ContactPoint) : void{};
当刚体之间的接触一直保持着,调用Persist方法,point是接触点。
/// Called when a contact point is removed. This includes the last
/// computed geometry and forces.
public virtual function Remove(point:b2ContactPoint) : void{};
当接触在一起的刚体刚分开时调用,point为分开之前的接触点。
/// Called after a contact point is solved.
public virtual function Result(point:b2ContactResult) : void{};
这个不知道如何翻译了,搞清楚了再补上吧!
要监听刚体的碰撞,我们可以继承这个类,然后重写这些方法来处理我们自己的碰撞效果,比如加上声音的播放等等。
下面是一个应用的例子:
1。用FlashDevelop建立一个FlashIDE工程,建立ContactTest.fla和ContactTest.as,ContactTest.as作为文档类。在ContactTest.fla库中导入声音导出的类名为MySound,库中再建立一个基类为Sprite的矩形,导出类名为MyFloor,再建立一个基类为MovieClip的圆形,两帧,导出类名为MyBall,再建立一个基类为MovieClip的举行,两帧,导出类名为MyRect。
2。自定义MyContactListener继承自b2ContactListener,重写了上面四个方法。分别加入了声音和MovieClip的帧跳转命令。
3。在文档类中,初始化world后,调用world的SetContactListener方法设置碰撞监听。如:_world.SetContactListener(myContactListener);
下面为个例子: