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