Box2D 接触监听器和过滤器

站在那边的开发的同志们,我现在想我需要分享一下我在我的游戏里面如何设置Box2d 接触监听器和过滤器的。

Contact Listeners可以让你控制一个对象如何跟一个碰撞起反应。我接触监听的要领在这里。Box2D有他自己的接触监听器类叫做b2ContactListener。你可以根据自己的需求来扩展此类,就像这样:
  1. public class GameContactListener extends b2ContactListener
  2. {               
  3.         /// 当添加了一个接触点的使用调用。
  4.         /// 这个包含几何和力量
  5.         public override function Add(point:b2ContactPoint) : void
  6.         {
  7.                 var obj1:GameObj = point.shape1.GetBody().GetUserData() as GameObj;
  8.                 var obj2:GameObj = point.shape2.GetBody().GetUserData() as GameObj;
  9.                 
  10.                 if (obj1 && obj2)
  11.                 {
  12.                         obj1.HandleContact(obj2);
  13.                         obj2.HandleContact(obj1);
  14.                 }
  15.                 else if (obj1)
  16.                 {
  17.                         obj1.HandleNonObjContact();
  18.                 }
  19.                 else if (obj2)
  20.                 {
  21.                         obj2.HandleNonObjContact();
  22.                 }
  23.         }
  24. }
复制代码
注意,我的所有游戏对象都是继承自我的基GameObject类,这个有HandleContact() 和 HandleNonObjContact() 方法,这两个方法被大量的游戏对象重写。这个以为着我可以根据不同的游戏对象通过修改这些方法而达到不同的个性化的碰撞反应。例如,我想在一棵树被球碰撞后,让它放大,我们可以这么干:
  1. public class Tree extends GameObj
  2. {
  3.         ...
  4.         public override function HandleContact(otherObj:GameObj) : void
  5.         {
  6.                 if (otherObj is Ball)
  7.                 {
  8.                         BlowUp();
  9.                 }
  10.         }
  11. }
复制代码
现在,只要我的树被一个Ball碰撞,它就会调用BlowUp() 方法。怎么样,帅不帅?酷不酷?性感不性感?

Contact Filters 可以让你控制何种事物会跟彼此起冲突。和Contact listener 一样,box2d有一个类叫做b2ContactFilter, 你可以在这里进行扩展以控制注册何种物体起冲突。让我们想想,当我们想让Ball和树可以产生碰撞效应,和云不能产生碰撞效应,该怎么实现呢。你可以像下面这样:
  1. public class GameContactFilter extends b2ContactFilter
  2. {
  3.         public override function ShouldCollide(shape1:b2Shape, shape2:b2Shape) : Boolean
  4.         {               
  5.                 // Custom collisions for game objects
  6.                 var obj1:GameObj = shape1.GetBody().GetUserData() as GameObj;
  7.                 var obj2:GameObj = shape2.GetBody().GetUserData() as GameObj;
  8.                 
  9.                 if (obj1 && obj2)
  10.                 {
  11.                         if (obj1.CanCollide(obj2) && obj2.CanCollide(obj1))
  12.                         {
  13.                                 return true;
  14.                         }
  15.                 }
  16.                 return false;
  17.         }                       
  18. }
复制代码
然后你的Ball, Tree 和 Cloud 类将是这样
  1. public class Tree extends GameObj
  2. {
  3.         ...
  4.         public override function CanCollide(otherObj:GameObj) : Boolean
  5.         {
  6.                 if (otherObj is Ball)
  7.                 {
  8.                         return true;
  9.                 }
  10.                 return false;
  11.         }
  12. }

  13. public class Ball extends GameObj
  14. {
  15.         ...
  16.         public override function CanCollide(otherObj:GameObj) : Boolean
  17.         {
  18.                 if (otherObj is Tree)
  19.                 {
  20.                         return true;
  21.                 }
  22.                 return false;
  23.         }
  24. }

  25. public class Cloud extends GameObj
  26. {
  27.         ...
  28.         public override function CanCollide(otherObj:GameObj) : Boolean
  29.         {
  30.                 return false;
  31.         }
  32. }
复制代码
现在,为了初始化box2d的物体,我有个这样的方法,这个方法使用我自定义的接触监听器和接触过滤器:
  1. public function InitPhysicsWorld():void
  2. {
  3.         var worldAABB:b2AABB = new b2AABB();
  4.         worldAABB.lowerBound.Set(-1000.0, -1000.0);
  5.         worldAABB.upperBound.Set(1000.0, 1000.0);
  6.                 
  7.         // 定义重力向量
  8.         var gravity:b2Vec2 = new b2Vec2(0.0, kGravity);
  9.                 
  10.         // 允许物体休眠
  11.         var doSleep:Boolean = true;
  12.                 
  13.         // 构建一个虚拟世界对象
  14.         mPhysicsWorld = new b2World(worldAABB, gravity, doSleep);
  15.                 
  16.         // 使用我的自定义监听器
  17.         mContactListener = new GameContactListener();
  18.         mPhysicsWorld.SetContactListener(mContactListener);
  19.                 
  20.         // 自定义接触过滤
  21.         mContactFilter = new GameContactFilter();
  22.         mPhysicsWorld.SetContactFilter(mContactFilter);
  23. }
复制代码
现在,你看到啦,我是如何处理自定义的接触监听和过滤的!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值