与Farseer一起跳跃

时间:2014-05-12 15:14:16

标签: monogame farseer

我有一个Player类,其中包含一个由球体代表的物理体,我希望能够分辨出玩家是在地上,墙上还是在空中。到目前为止,我有一个bool IsOnGround,我为物理主体设置了这些事件处理程序:

void PhysicsBody_OnSeparation(Fixture fixtureA, Fixture fixtureB)
{
    IsOnGround = false;
    PhysicsBody_OnCollision(fixtureA, fixtureB, null);
}

bool PhysicsBody_OnCollision(Fixture fixtureA, Fixture fixtureB,
    FarseerPhysics.Dynamics.Contacts.Contact contact)
{
    if (fixtureB.UserData is JumpableFixtureData &&
        fixtureB.Body.Position.Y > fixtureA.Body.Position.Y)
    {
        IsOnGround = true;
    }
    else
    {
        IsOnGround = false;
    }

    return true;
}

我有我的关卡,以便每个关卡对象将其物理主体的用户数据设置为JumpableFixtureData(只是一个空类),虽然大多数对象都是矩形,但有几个形状与洞穴般的开口,这样玩家就可以在里面打开形状。

我的问题是,当物体仍然在空中时,有时IsOnGround布尔值被设置为真,有时在接触地面后它仍然是假的。这种设置显然不起作用。我该怎么做呢?我在Box2D教程中找到了this tutorial,但我还没有永远使用C ++,我找不到任何方法来创建一个单独的灯具实例,所以我可以把它变为&#39 ;脚'

1 个答案:

答案 0 :(得分:1)

  • 我认为有一处叫做'#34; slop"这可能有所帮助。我不确定它是在系统,主体还是夹具层面。 Slop是允许重叠和平滑身体相互碰撞的阈值。
  • 或者你可以在较大的碰撞体积(球体或圆形)内伸出第二个较小的碰撞体积(球形或圆形)。它可能是一个传感器,所以较大的音量将处理碰撞分辨率,然后这个传感器可以修改您的'on_ground'布尔值。