首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发射大量子弹后,Box2D碰撞检测失败

发射大量子弹后,Box2D碰撞检测失败
EN

Stack Overflow用户
提问于 2019-04-29 12:36:06
回答 1查看 429关注 0票数 0

我正在做一个物理游戏,遇到了一个奇怪的错误:有时,在发射了大量子弹后,碰撞检测就开始失败。

从下面的GIF中可以看出,碰撞只在半个平台上起作用,这是非常奇怪的。此外,还启用了Box2D调试呈现程序,并且还可以看到平台是一个单一的主体。

下面是我如何让这个bug发生的原因,因为只有在发射了大量子弹之后才会发生这种情况(在开始时,一切都很好):

备注:

  • bullet字段设置为true
  • 我把球员的bullet字段设置为true,没有什么区别
  • 这个球员是1米乘1米。
  • 播放器和子弹是DynamicBodies,平台是StaticBodies
  • 这张地图接近于(0,0),虽然它在底片上有一点变化(-1.5),但我怀疑它是否重要。
  • categoryBitsmaskBits是正确的(碰撞应该发生,确实会发生,但会出现故障)
  • 子弹消失后,身体的数量与游戏开始时的数量相同(因此它们实际上被销毁了)。
  • World的重力是(0,-25度)
  • 比赛速度为60英尺。

下面是Box2D时间步长代码,类似于来自libGDX维基的步进代码

代码语言:javascript
复制
companion object {
    private const val TIME_STEP = 1f / 300f
    private const val VELOCITY_ITERATIONS = 6
    private const val POSITION_ITERATIONS = 2
}

private var accumulator = 0f

override fun update(deltaTime: Float) {
    accumulator += Math.min(deltaTime, 0.25f)
    while (accumulator >= TIME_STEP) {
        world.step(TIME_STEP, VELOCITY_ITERATIONS, POSITION_ITERATIONS)
        accumulator -= TIME_STEP
    }
}

我试着改变:

  • TIME_STEP值较低,如1/60f
  • VELOCITY_ITERATIONS稍微高一点,到8
  • POSITION_ITERATIONS稍微高一点,到6
  • VELOCITY_ITERATIONSPOSITION_ITERATIONS到100 两者之间没有明显的差异。

关注点:

被窃听的平台似乎开始表现得像一颗子弹(它不会与其他子弹或玩家相撞),至少一半。那么,在经历了大量的categoryBitsworld.destroyBody()之后,它的maskBitsworld.createBody()能否在飞行中被改变,也许是因为共享?

那么,在这种情况下,我应该如何避免碰撞失败呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-02 18:46:15

我终于修好了。

我找到的解决方案是循环遍历每个有主体的实体,并调用refilter(),这似乎是修复了它:

代码语言:javascript
复制
engine.getEntitiesFor(Family.one(BodyComponent::class.java).get()).forEach {
    it.body.body.fixtureList.first().refilter()
}

将来,我只能在需要的时候才调用refilter() (如果我可以确定何时必须调用它),而不是调用每个帧,但它现在起作用了。

看起来,在更改了refilter()之外的身体的filterData (改变其categoryBitsmaskBits)之后,应该调用FixtureDef,但是我似乎并没有这么做(或者我遗漏了什么东西),所以这有点奇怪。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55903552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档