Box2DWeb_04之碰撞检测

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";

 下面是监听的添加

function createWorld(){ 

    //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

    var contactListener = new b2ContactListener();
    contactListener.BeginContact = beginContact;
    contactListener.EndContact   = endContact;
    contactListener.PreSolve     = preSolve;
    contactListener.PostSolve    = postSolve;
    world.SetContactListener(contactListener);
    
    setInterval(update, 1000/30);
};

 

 下面是beginContact当我们碰撞的时候每次把小球的半径变大一点

function beginContact(contact){

  if(contact.GetFixtureA().GetBody().GetUserData() == "ball" || contact.GetFixtureB().GetBody().GetUserData() == "ball"){
        var ball = contact.GetFixtureB().GetShape();
        ball.SetRadius(ball.GetRadius()*1.2);
    }
};

Your browser does not support the canvas element.

 碰撞过滤

 我们直接设置监听他默认会对每一个body进行检测!但是有时候我们不需要对某些检测碰撞或者对默写检测碰撞,比如当我们有一个身体时胳膊和身体总是要接触的,然而这中是没有意义的

却大量存在着,我们也要每次都判断在box2d中为我们提供了两种过滤的方式

一种比较简单也比较适用简单的逻辑设置bodyDef.filter的groupIndex放groupIndex为整数的时候总是检测碰撞!当为负数的时侯总是不检测同一群组,需要注意的是不同的索引依然会发生碰撞检测比如-1组合-2组依然会!

还有另外一种比较复杂设置bodyDef.filter的categoryBits值与maskBits值完成的,categoryBits用于定义自己所属的碰撞种类,maskBits则是指定碰撞种类。

 

如果没有在b2FixtureDef中设置fixture的filter.categoryBits和filter.maskBits ,则其默认值是 categoryBits = 0x0001 ,maskBits = 0xFFFF(意味着body在默认情况下,可以跟所有物体发生碰撞) 

 

 表达能力有限,这个比较绕直接去看这个吧:http://blog.sina.com.cn/s/blog_6a2061a20100n0or.html

 碰撞力度 

 当有时候我们需要知道两个物体在碰撞的时候的力度是多少以做出正确的反应

 我们可以再postSolve方法中通过b2ContactImpulse参数获得impulse.normalImpulses[0] > value,更多信息详情参见API

 

 

posted @ 2012-03-20 18:05  _公孓℡  阅读(2290)  评论(1编辑  收藏  举报