我正在用impactjs編寫遊戲,並且我使用Box2D作爲物理引擎(Box2DFlash具體)。所以他有一個不應該與敵人相撞的動作。實現這種碰撞過濾似乎是最好的方法。在Box2D中禁用碰撞:當實體已經發生碰撞時不起作用
所以我設置了敵人夾具:
var shapeDef = new b2.PolygonDef();
shapeDef.filter.categoryBits = 0x0002;
而對於玩家:
var shapeDef = new b2.PolygonDef();
shapeDef.filter.categoryBits = 0x0004;
當我想給玩家的開/關碰撞開啓與我稱這些敵人功能:
ghost: function(){
this.setMaskBits(0x0001); // only collide with boundary
},
deghost: function() {
this.setMaskBits(0xFFFF); // collide with everything
},
setMaskBits: function (bits) {
this.body.GetShapeList().m_filter.maskBits = bits;
}
而且它的工作...但只有當他們沒有相互碰撞。同樣的問題發生在我面臨牆壁時,我將categoryBits設置爲0x0000
。
UPDATE
好吧,我用骯髒的黑客固定它: 問題是,接觸仍然存在,所以我必須以某種方式將其刪除。我試圖手動刪除它們,但失敗了。
在Box2D中的說明書寫的是:
聯繫被破壞與停止的AABB重疊。
因此,我寫了一個函數,讓玩家在他所面對的目錄中移動大約6px(似乎工作的最小量)(如果他在那一刻不與牆碰撞),這會重疊實體並解決問題。
這裏是有問題的功能:
changePosition: function (x,y) {
this.facingWall = false;
this.collision(); // will set facingWall to true if he's facing a wall.
if(!this.facingWall) {
this.body.m_xf.position.x = x;
this.body.m_xf.position.y = y;
}
}