防止Box2d玩家在空中按压墙壁

5
我已经设置了一个带有键盘控制玩家的box2d世界。玩家可以行走和跳跃。如何防止玩家在跳跃并按向物体方向的方向键时“粘”在墙上?
4个回答

9

如何将玩家身体设置为多个物体的组(在左右两侧添加夹具)?并将摩擦力设置为0。

enter image description here

有趣的方法。我会尝试一下。我也一直在考虑将物体的摩擦系数设为零,并添加一个带有摩擦力的脚部装置。这样做的利弊是什么? - Mattias
当然,您可以将身体夹具摩擦设置为零,并且将脚夹具设置为非零摩擦力,但是,如果您的脚和身体夹具宽度相同,则当脚接触墙壁时会产生相同的效果(粘着)。如果您将脚宽度设置为小于身体宽度,则可能会在拐角处遇到麻烦。 - zaynyatyi

3

您需要改变影响角色身体的方式。您使用什么方法将其向左/右移动?尝试在身体上应用applyLinearImpulse,并确保身体定义中的摩擦不是非常高。


我正在应用线性速度。如果我将摩擦设置为0,我会得到想要的结果,但是我必须在地面上使用另一种摩擦力。否则玩家会像溜冰一样滑动。 - Mattias
默认情况下,你的摩擦系数设置为多少? - user562566
默认值设置为1。 - Mattias
1 是最大摩擦力,其值必须介于 1.0(100%)和 0(0%)之间,因此请将其设置为介于 0 和 1 之间的适度值。 - user562566
如果你将摩擦力设为0,你在倾斜平台上可能会遇到麻烦。 - zaynyatyi

1
你可以将玩家的摩擦力设置为0,然后在每个循环中执行一个函数,当用户没有按下移动键时,将X轴速度设置为零。在检查事件的方法中,应添加以下内容:
if (event.type == KeyReleased) {
    if (!isKeyPressed(Keyboard::Left) && !isKeyPressed(Keyboard::Right)) {
        player.stop();
     }
}

在你的player.stop()中,你应该做类似这样的事情:
b2Vec2 vel = body->GetLinearVelocity();
vel.x = 0;
body->SetLinearVelocity(vel);

这将使你的玩家在与冰面接触时具有摩擦力为0。

0

这完全取决于你的物理引擎目前是如何工作的,因为有很多可能性。在我看来,最简单的方法是将显示的物体分成四个边界墙(上、左、右、下),只让可行走的地面(顶部)产生摩擦。


那么您是在建议每个平台都应该有四个边吗?还是您在谈论玩家? - Mattias
无论如何,这取决于您的目的、您当前编码的方式以及应用程序中的其他内容(需要推动的框等)。 - felipemaia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接