Flutter - 火焰引擎 | collision: 当一个物体有很高的 velocity/speed 碰撞不触发
Flutter - Flame engine | collision: When an object have a high velocity/speed the collision don't trigger
我做了一些测试,我看到当一个物体有很高的 velocity/speed 碰撞不会触发。
关于火焰 docs 它指出:
Do note that the built-in collision detection system does not take
collisions between two hitboxes that overshoot each other into
account, this could happen when they either move too fast or update
being called with a large delta time (for example if your app is not
in the foreground). This behaviour is called tunneling, if you want to
read more about it. I would love to see something talking about that
and how we can avoid that!There is a good approach for that type of
thing?
我通过一些其他测试意识到了一些事情。
修改角度会触发碰撞。 (不知道为什么刷不出来)
更新函数(修改 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) 和绿色地板。
但是对撞机不会触发。仅当我在命中框上“跳跃”时触发。
P.S。拖沓的 visual/animation 只是因为它是一个 gif
编辑:
我通过其他一些测试意识到了一些事情。
如果角度被修改,有更好的机会触发碰撞。看起来它现在很管用。 (不知道为什么)
想象一下,你有一个函数,return 一个角度基于更新时你当前的真实角度,你添加一个随机数来添加你当前角度的微小变化。
角度随机器非常小,甚至看不见。 (至少在canvas方格上)
...
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
我做了一些测试,我看到当一个物体有很高的 velocity/speed 碰撞不会触发。
关于火焰 docs 它指出:
Do note that the built-in collision detection system does not take collisions between two hitboxes that overshoot each other into account, this could happen when they either move too fast or update being called with a large delta time (for example if your app is not in the foreground). This behaviour is called tunneling, if you want to read more about it. I would love to see something talking about that and how we can avoid that!There is a good approach for that type of thing?
我通过一些其他测试意识到了一些事情。
修改角度会触发碰撞。 (不知道为什么刷不出来)
更新函数(修改 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) 和绿色地板。 但是对撞机不会触发。仅当我在命中框上“跳跃”时触发。
P.S。拖沓的 visual/animation 只是因为它是一个 gif
编辑: 我通过其他一些测试意识到了一些事情。
如果角度被修改,有更好的机会触发碰撞。看起来它现在很管用。 (不知道为什么)
想象一下,你有一个函数,return 一个角度基于更新时你当前的真实角度,你添加一个随机数来添加你当前角度的微小变化。
角度随机器非常小,甚至看不见。 (至少在canvas方格上)
...
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