在碰撞检测中有两种方式一个是组索引形式 另外一种是种群加掩码形式的
(如果一个进行了掩码设置那么所有的物体都要有掩码否则的画 这个物体默认的一些设定如下
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;
}