在Box2D中禁用碰撞:当实体已经发生碰撞时不起作用



我正在用impactjs编写一款游戏,我使用Box2D作为物理引擎(具体来说是Box2DFlash)。所以玩家有一个动作,他不应该与敌人相撞。要实现这一点,碰撞过滤似乎是最好的方法。

所以我设置为敌人夹具:

 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时,也会出现同样的问题。

好的,我用一个肮脏的hack修复了它:问题是,这些联系人仍然存在,所以我必须以某种方式删除它们。我尝试手动删除它们,但失败了。

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

您可以在更改了碰撞设置的fixture上调用Refilter()

好的,我用一个肮脏的hack修复了它:问题是,这些联系人仍然存在,所以我必须以某种方式删除它们。我尝试手动删除它们,但失败了。

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

最新更新