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

时间:2013-03-19 20:22:55

标签: javascript box2d collision game-physics impactjs

我正在用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时会出现同样的问题。

更新

好的,我用肮脏的黑客修复了它: 问题是,联系人仍然存在,所以我不得不以某种方式删除它们。我试图先手动删除它们但失败了。

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以在碰撞设置已更改的灯具上调用Refilter()。

相关问题