具有Box2D的LibGDX无法理解Velocity()。y

时间:2018-11-28 21:56:34

标签: java libgdx box2d physics

我正在使用LibGDX学习Box2D的基础知识。我今天来到你们这里是因为我很难理解Velocity的工作原理。 我实际上使用了两个主体:一个是DynamicBody(用于播放器),另一个是StaticBody(地面)。在图片中看起来像这样: game_screen 现在,没有错,我接下来添加了一个ControlSystem,它允许玩家使用方向箭头移动(明显地向上,向左和向右)。问题出在我想向左/向右走时,每当使用 Body.setLinearVelocity(somevalue,0)时,它移动得很好,但是我仍然有 Y速度 >我不想要的。我高度认为这是由地面引起的(某种程度上是由摩擦或类似的东西引起的),但是我对一般物理学一无所知,所以我不能说真的。我想知道是否有一种方法可以将 Y Linearvelocity 设置为0左右移动播放器。 顺便说一句,我希望将此Y LinearVelocity设置为0,因为如果 Y LinearVelocity大于0,我使用一个“ StateComponent”将状态设置为“ JUMPING”。 代码如下:

@Override
protected void processEntity(Entity entity, float deltaTime) {
    BodyComponent bodyComp = bodm.get(entity);
    StateCompent state = sm.get(entity);
    TextureComponent texComp = texm.get(entity);

    if(bodyComp.body.getLinearVelocity().y > 0){
        state.set(StateCompent.STATE_FALLING);
    }

    if(bodyComp.body.getLinearVelocity().y == 0){
        if(state.get() == StateCompent.STATE_FALLING){
            state.set(StateCompent.STATE_NORMAL);
        }
        if(bodyComp.body.getLinearVelocity().x != 0){
            state.set(StateCompent.STATE_MOVING);
        }
    }
    if(controller.left){
        bodyComp.body.setLinearVelocity(MathUtils.lerp(bodyComp.body.getLinearVelocity().x, -2f, 0.2f),bodyComp.body.getLinearVelocity().y);
        if(!texComp.region.isFlipX()){
            texComp.region.flip(true, false);
        }
    }
    if(controller.right){
        bodyComp.body.setLinearVelocity(MathUtils.lerp(bodyComp.body.getLinearVelocity().x, 2f, 0.2f),bodyComp.body.getLinearVelocity().y);
        if(texComp.region.isFlipX()){
            texComp.region.flip(true, false);
        }
    }
    if(!controller.left && ! controller.right){
        bodyComp.body.setLinearVelocity(MathUtils.lerp(bodyComp.body.getLinearVelocity().x, 0, 0.1f),bodyComp.body.getLinearVelocity().y);
    }

    if(controller.up && (state.get() == StateCompent.STATE_NORMAL || state.get() == StateCompent.STATE_MOVING)){
        bodyComp.body.applyLinearImpulse(0,10f, bodyComp.body.getWorldCenter().x, bodyComp.body.getWorldCenter().y, true);
        state.set(StateCompent.STATE_JUMPING);
    }

    // Hud to delete later
    hudBatch.begin();
    layout.setText(font, " X velocity : " + Float.toString(bodyComp.body.getLinearVelocity().x));
    font.draw(hudBatch, " X velocity : " + Float.toString(bodyComp.body.getLinearVelocity().x), Gdx.graphics.getWidth() - (layout.width + 20), Gdx.graphics.getHeight() - layout.height);
    layout.setText(font, " Y velocity : " + Float.toString(bodyComp.body.getLinearVelocity().y));
    font.draw(hudBatch, " Y velocity : " + Float.toString(bodyComp.body.getLinearVelocity().y), Gdx.graphics.getWidth() - (layout.width + 20), Gdx.graphics.getHeight() - (layout.height + 20));
    font.draw(hudBatch, "State : " + Integer.toString(state.get()), 20, Gdx.graphics.getHeight() - 20 );
    hudBatch.end();

也许需要的话,我的两个身体的FixtureDef:

  fixtureDef.density = 1f;
  fixtureDef.friction = 0.2f;
  fixtureDef.restitution = 0.01f;

我还上传了video,您可以在此视频中看到,当我使用向左或向右箭头键移动Velocity Y时,速度最高可达0,000000001。知道为什么吗?

2 个答案:

答案 0 :(得分:0)

大多数物理引擎自然在两个方向上都有一点点速度,尤其是在碰撞过程中。只需将此因素纳入您的跳转检查中即可,例如将阈值略高于0。

答案 1 :(得分:0)

好的,我发现了一些很有趣的东西。由于这个问题,我感到很惊讶,因为我首先关注了this tutorial,并且在其中效果很好。我刚刚注意到,在本教程中,我们为播放器使用了Circle形状,因此我尝试了一下,并且效果很好。可能是因为联系点较少或类似的东西。