3

我做了一些测试,我看到当一个物体的速度/速度很高时,碰撞不会触发。

在 Flame文档中,它指出:

请注意,内置的碰撞检测系统不会考虑两个碰撞箱之间的碰撞,这两个碰撞箱之间的碰撞会相互冲撞,这可能发生在它们移动过快或以较大的增量时间调用更新时(例如,如果您的应用不是在前台)。如果您想了解更多有关它的信息,这种行为称为隧道。我很想看到一些关于这个的话题,以及我们如何避免这种情况!这种事情有什么好的方法吗?

我通过其他一些测试意识到了一些事情。

如果修改了角度,就会触发碰撞。(我不知道为什么它不会变白)

更新函数(修改 Y 值)如下所示:

@override
  void update(double dt) {
    super.update(dt);
    y = y + _speedY * dt - _GRAVITY * dt * dt / 2;
    _speedY += _GRAVITY * dt;
    angle = velocityAngle(_speedY);
  }

例子:

在那个 gif 上,你可以看到立方体有一个形状(HitboxRectangle)和绿色地板。但是对撞机不会触发。仅当我在 hitbox 上“跳跃”时才会触发。

在此处输入图像描述

PS滞后的视觉/动画只是因为它是一个gif


编辑:我意识到其他一些测试。

如果角度被修改,有更好的机会触发碰撞。看起来它现在可以正常工作。(我不知道为什么)

想象一下,您有一个函数,它根据更新时的真实当前角度返回一个角度,并添加一个随机数以添加当前角度的微小变化。

角度随机化器非常小,甚至不可见。(至少在画布广场上)

...
var rng = (new Random().nextInt(4) - 2) / 1000;
return angle + rng;

我真的不喜欢那种奇怪的解决方案..但它有效!也许它有助于发现原因和更好的解决方案。

4

1 回答 1

2

rc9 中有一个关于碰撞检测的错误,这在 rc10(或我们今天发布的 rc11)中应该可以正常工作。您的组件移动速度不够快,无法错过整个碰撞检查。

请注意,在您的 pubspec 文件中您不能指定^1.0.0-rc10,因为 pub 将 rc10 视为低于 rc10,因此您必须特别说明1.0.0-rc10(不带^)。

编辑: rc11 现已发布,所以现在您可以再次使用 ^:

dependencies:
  ...
  flame: ^1.0.0-releasecandidate.11
于 2021-05-21T18:51:38.863 回答