【问题标题】:Disable collision on the fly in Box2D: does not work when entity is already colliding在 Box2D 中动态禁用碰撞:当实体已经发生碰撞时不起作用
【发布时间】:2013-03-08 17:27:59
【问题描述】:

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

【问题讨论】:

    标签: javascript box2d collision game-physics impactjs


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      好的,我用一个肮脏的 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;
          }
        } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多