2013-03-19 16 views
1

我正在用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; 
    } 
    } 

回答

1

好吧,我用骯髒的黑客固定它: 問題是,接觸仍然存在,所以我必須以某種方式將其刪除。我試圖手動刪除它們,但失敗了。

在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; 
    } 
    } 
1

您可以爲其碰撞設置被改變燈具調用重新過濾()。