Flutter - 火焰引擎 |碰撞:当物体具有高速度/速度时,碰撞不会触发

问题描述

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

在 Flame 文档中的注释 (https://flame-engine.org/docs/#/collision_detection?id=collision-detection):

请注意,内置碰撞检测系统不带 两个碰撞盒之间相互碰撞 帐户,当他们移动太快或更新时可能会发生这种情况 以较大的增量时间调用(例如,如果您的应用程序不是 在前台)。这种行为称为隧道,如果你想 阅读更多相关信息。我很想看到一些谈论那个 以及我们如何避免这种情况! 东西?

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

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

更新函数修改 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) 和绿色的地板。 但对撞机不会触发。仅当我在命中框上“跳跃”时触发。

enter image description here

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


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

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

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

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

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

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

解决方法

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

请注意,在您的 pubspec 文件中,您不能指定 ^1.0.0-rc10,因为 pub 将 rc10 视为低于 rc10,因此您必须专门说 1.0.0-rc10(没有 ^) .

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

dependencies:
  ...
  flame: ^1.0.0-releasecandidate.11

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...