box2d内部已经为我们实现了碰撞检测!我们要做的是得到
监听碰撞
碰撞过滤
碰撞力度
来完成自己的处理
监听碰撞
b2ContactListener是box2d为我们提供的监听器,他为我们实现了四个方法
BeginContact(contact:b2Contact)--------刚刚碰撞开始的时候会触发这个函数
EndContact (contact: b2Contact ) -------碰撞结束的时候会触发这个函数PostSolve(contact:b2Contact, impulse:b2ContactImpulse)-----碰撞后会处理这个函数
PreSolve (contact: b2Contact , oldManifold: b2Manifold )--------- 碰撞前即将碰撞的时候那我么改写createWorld方法!同样这次也是基于mouseControl
为了在做碰撞检测的时候可以区分不同body于body之间的区别我们需要给body加上一些标示! 如: bodyDef.userData = "ball";
下面是监听的添加
//debugDraw
var debug = new b2DebugDraw();
debug.SetSprite(document.getElementById("stage").getContext("2d"));//必须先设置context,后面才能设置ctx的线条宽度以及其他属性
debug.SetDrawScale(drawScale);
debug.SetFillAlpha(0.5);
debug.SetLineThickness(1.0);
debug.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
world.SetDebugDraw(debug);
//Listener
contactListener.EndContact = endContact;
contactListener.PreSolve = preSolve;
contactListener.PostSolve = postSolve;
world.SetContactListener(contactListener);
setInterval(update, 1000/30);
};
下面是beginContact当我们碰撞的时候每次把小球的半径变大一点
if(contact.GetFixtureA().GetBody().GetUserData() == "ball" || contact.GetFixtureB().GetBody().GetUserData() == "ball"){
var ball = contact.GetFixtureB().GetShape();
ball.SetRadius(ball.GetRadius()*1.2);
}
};
碰撞过滤
我们直接设置监听他默认会对每一个body进行检测!但是有时候我们不需要对某些检测碰撞或者对默写检测碰撞,比如当我们有一个身体时胳膊和身体总是要接触的,然而这中是没有意义的
却大量存在着,我们也要每次都判断在box2d中为我们提供了两种过滤的方式
一种比较简单也比较适用简单的逻辑设置bodyDef.filter的groupIndex放groupIndex为整数的时候总是检测碰撞!当为负数的时侯总是不检测同一群组,需要注意的是不同的索引依然会发生碰撞检测比如-1组合-2组依然会!
还有另外一种比较复杂设置bodyDef.filter的categoryBits值与maskBits值完成的,categoryBits用于定义自己所属的碰撞种类,maskBits则是指定碰撞种类。
表达能力有限,这个比较绕直接去看这个吧:http://blog.sina.com.cn/s/blog_6a2061a20100n0or.html
碰撞力度
当有时候我们需要知道两个物体在碰撞的时候的力度是多少以做出正确的反应
我们可以再postSolve方法中通过b2ContactImpulse参数获得impulse.normalImpulses[0] > value,更多信息详情参见API