box2d碰撞过滤

来源:互联网 发布:刺客信条叛变优化补丁 编辑:程序博客网 时间:2024/05/17 04:56

 

在碰撞检测中有两种方式一个是组索引形式 另外一种是种群加掩码形式的
(如果一个进行了掩码设置那么所有的物体都要有掩码否则的画 这个物体默认的一些设定如下
  filter.categoryBits = 0x0001;   
filter.maskBits = 0xFFFF;         
filter.groupIndex = 0;       
//默认情况下的categirybits值为1 掩码是最大值 如果刚开始用的是默认值的时候意思就是所有的物体的种即categoryBits为1 
//那么就是默认情况下所有的物体都相撞,如果其他的设定了categoryBits且不是默认值,那么他的掩码默认是0xFFFF是一个很大的数字      
 //能和所有的物体相撞所以如果设置了categoryBits而没有设定mask则所有的物体仍然按组索引来进行判断组索引默认状况下是0
//maskbits和种群在情况复杂是要对两个物体都进行设置
碰撞:先判断是否能碰撞groupIndex,再判断具体物体是否可以碰撞maskBits


我们可以通过设置“碰撞过滤器”对碰撞更好的控制。
他是通过以下三个参数设置的:
fixture,fitire.categoryBits;//我是……
fixture.fitire.maskBitd;//我和……碰撞
fixture.groundIndex //整数碰撞,负数不碰撞,优先级高
如果两个groundIndex都为负,不碰撞,不考虑后面的情况
如果有一个
如果两个groundIndex一正一负,不碰撞,不考虑后面的情况
如果两个groundIndex相同且为正,碰撞。不考虑后面情况

categoryBits默认值0x0001,maskBits默认值0xFFFF
换句话说:每个fixture都会说:“我是一个物体,我会和所有物体碰撞”

 

传感器(Sensors)

有时候游戏逻辑需要判断两个fixture是否相交,但却不应该有碰撞反应。这可以通过传感器(sensor)来完成。传感器也是个fixture,但只会侦测碰撞而不产生其它反应。

你可以将任一fixture标记为传感器。传感器可以是static或dynamic的。记住,每个物体上可以有多个fixture, 传感器和实体fixture是可以混合存在的。

传感器不会生成接触点。这里有两种方法得到传感器的状态:

1. b2Contact::IsTouching

2. b2ContactListener::BeginContact 和 EndContact

 

根据Box参考手册,如果你想让对象之间有碰撞检测但是又不想让它们有碰撞反应,那么你就需要把isSensor设置成true。

 

//创建一个带有确定了碰撞过滤器的body

b2Body* MyTools::CreateBody(b2World* world,CCSprite*Usersprite,int shape,
       float density,float friction,float ScaleX,float ScaleY)
{

 CCPoint RolePoint = Usersprite->getPosition();

 b2BodyDef RoleBodyDef;
 RoleBodyDef.type = b2_dynamicBody;
 RoleBodyDef.position.Set(RolePoint.x/PTM_RATIO,RolePoint.y/PTM_RATIO);
 RoleBodyDef.userData = Usersprite;

 b2Body*RoleBody = world->CreateBody(&RoleBodyDef);

 //define shape
 float hx = Usersprite->getTextureRect().size.width/(PTM_RATIO*2)*ScaleX;
 float hy = Usersprite->getTextureRect().size.height/(PTM_RATIO*2)*ScaleY;
 //define fixture
 b2FixtureDef fixDef;
 switch (shape)
 {
  
 case SHAPE_RECT:
  {
   b2PolygonShape dynamicShape;
   dynamicShape.SetAsBox(hx,hy);//These are mid points for our 1m box
  
   fixDef.shape = &dynamicShape;
   fixDef.density = density;
   fixDef.friction = friction;
   fixDef.filter.groupIndex = -1;
  }
  break;
 }

 RoleBody->CreateFixture(&fixDef);
 
 
 return RoleBody;
}

 

 

原创粉丝点击