Egret-Box2d (二) 碰撞
當(dāng)物體在物理場(chǎng)景中發(fā)生碰撞時(shí),會(huì)發(fā)生一些事情,比如主角碰到怪物死了,所以我們需要獲取到碰撞時(shí)的一些信息。
首先創(chuàng)建一個(gè)碰撞的監(jiān)聽(tīng)器,并把它添加到世界上。
this.contact?=?new?b2ContactListener();
this.world.SetContactListener(this.contact)
然后添加上碰撞回調(diào),BeginContact就是剛開(kāi)始接觸的時(shí)候,EndContact是最后離開(kāi)的時(shí)候。
this.contact.BeginContact?=?(contact:?b2Contact<b2Shape,?b2Shape>)?=>?{
? ?????console.log('碰撞開(kāi)始');
}
this.contact.EndContact=(contact:?b2Contact<b2Shape,?b2Shape>)?=>?{
???????console.log('碰撞結(jié)束');
}

?contact.GetFixtureA().GetBody().GetUserData();
?contact.GetFixtureB().GetBody().GetUserData();

同時(shí),夾具(Fixture)中含有過(guò)濾(Filter)屬性,我們可以使用碰撞過(guò)濾來(lái)更好的控制碰撞,F(xiàn)ilter中有categoryBits和maskBits兩個(gè)屬性,categoryBits的意思是“我是。。。”,maskBits的意思是“我能和。。。碰”。
此時(shí)我們把地板設(shè)置為2,他能和1碰,把掉落的物體設(shè)置為1,他能和2碰(這些數(shù)字必須是2的N次方倍)
//地板的
groundFixDef.filter.categoryBits?=2;
groundFixDef.filter.maskBits?=?1;
//掉落物體的
fixDef.filter.categoryBits?=?1;
?fixDef.filter.maskBits?=?2;
然后他們就發(fā)生碰撞了,但如果其中一個(gè)不想碰,比如?fixDef.filter.maskBits修改為4,那么他們就無(wú)法發(fā)生碰撞



我們除了可以用categoryBits和maskBits進(jìn)行過(guò)濾,還可以使用groupIndex,且一旦使用groupIndex,之前的categoryBits和maskBits就無(wú)效了,也就是說(shuō)groupIndex的優(yōu)先級(jí)要高于categoryBits和maskBits。
發(fā)生碰撞的條件:兩個(gè)物體的groupIndex屬性值必須相同且不為0,為正發(fā)生碰撞,為負(fù)不發(fā)生碰撞。