LibGDX с Box2D, не может понять Velocity (). - PullRequest
0 голосов
/ 29 ноября 2018

Я изучаю основы Box2D, используя LibGDX.Сегодня я прихожу к вам, ребята, потому что мне сложно понять, как работает Velocity.Я на самом деле использую два тела: одно DynamicBody (для игрока) и одно StaticBody (земля).На изображении это выглядит так: game_screen На данный момент все в порядке, я добавил систему управления, которая позволяет игроку использовать стрелки для перемещения (очевидно, вверх, влево и вправо).Проблема возникает, когда я хочу идти влево / вправо, когда используется Body.setLinearVelocity (somevalue, 0) , он движется хорошо, но у меня все еще есть небольшая величина Y скорость , котораяЯ не хочуЯ очень думаю, что это вызвано землей (каким-то образом с трением или что-то вроде этого), но я действительно ничего не знаю о физике в целом, поэтому я не могу сказать точно.Я хочу знать, есть ли способ переместить игрока влево и вправо с Y Linearvelocity на 0. Кстати, я хочу, чтобы Y LinearVelocity равнялся 0, потому что я использую «StateComponent», который он устанавливаетсостояние «Прыжок», если Y LinearVelocity больше 0. Код выглядит следующим образом:

@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;

Я также загрузил видео , на этом видео вы можете видеть, что когда я использую левую или правую клавишу со стрелкой для перемещения, скорость Y достигает значения, равного 0,000000001.Есть идеи почему?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Хорошо, ребята, я нашел кое-что довольно интересное.Я был удивлен из-за этой проблемы, потому что я сначала следовал этому учебнику , и он хорошо сработалЯ только что заметил, что в этом уроке мы используем форму круга для игрока, поэтому я попробовал это, и это сработало так, как я хотел.Может быть, потому что там меньше точки соприкосновения или что-то в этом роде.

0 голосов
/ 29 ноября 2018

Большинство физических двигателей естественно имеют небольшую скорость в обоих направлениях, особенно во время столкновений.Просто учтите это при проверке прыжка, например, сделайте порог немного выше 0.

...