gpt4 book ai didi

javascript - 在 Box2D : does not work when entity is already colliding 中即时禁用碰撞

转载 作者:行者123 更新时间:2023-11-30 18:07:21 25 4
gpt4 key购买 nike

我正在用 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的手册中写到:

Contacts are destroyed with the AABBs cease to overlap.

所以我写了一个函数,让玩家在他面对的目录中移动大约 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;
}
}

最佳答案

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

关于javascript - 在 Box2D : does not work when entity is already colliding 中即时禁用碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15509661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com