libgdx box2d Мозаичная карта

У меня проблема: я программирую игру с тайловой картой с помощью Box2D, но проблема в том, что если я нажимаю, например, D, чтобы двигаться вперед с моим персонажем, вектор 2 заставляет меня двигаться все быстрее и быстрее, поэтому я сделал это:

if (Gdx.input.isKeyJustPressed(Input.Keys.W) && player.b2body.getLinearVelocity().y == 0)
            player.b2body.applyLinearImpulse(new Vector2(0, 4f), player.b2body.getWorldCenter(), true);
        if (Gdx.input.isKeyPressed(Input.Keys.D))
            player.b2body.applyLinearImpulse(new Vector2(0.1f, 0), player.b2body.getWorldCenter(), true);
        if (Gdx.input.isKeyPressed(Input.Keys.A))
            player.b2body.applyLinearImpulse(new Vector2(-0.1f, 0), player.b2body.getWorldCenter(), true);
if (player.b2body.getLinearVelocity().x > 2) {
        player.b2body.setLinearVelocity(2, player.b2body.getLinearVelocity().y);
    }
    else if (player.b2body.getLinearVelocity().x < -2) {
        player.b2body.setLinearVelocity(-2, player.b2body.getLinearVelocity().y);
    }

Таким образом, у игрока есть максимальная скорость, равная двум. Но когда он падает на землю, он медленнее примерно на полсекунды, потому что он становится быстрее в воздухе. Как я могу это исправить?

И мой второй квест: Когда я прыгаю и снова нажимаю прыжок сразу после того, как ударяю по гору, персонаж не прыгает! Почему и как я могу это исправить?

Надеюсь, вы можете мне помочь, и спасибо заранее!


person Tobls    schedule 24.10.2015    source источник
comment
интересно, была ли ваша проблема решена, если да, не могли бы вы превратить свой вопрос в решенный, выбрав правильный ответ, спасибо   -  person Netero    schedule 04.12.2015


Ответы (2)


Но когда он падает на землю, он медленнее примерно на полсекунды, потому что он становится быстрее в воздухе. Как я могу это исправить?

Я думаю, это из-за трения, попробуйте установить трение на ноль в BodyDef при создании тела.

Когда я прыгаю и снова нажимаю прыжок сразу после удара о землю, персонаж не прыгает! Почему и как я могу это исправить?

Я предлагаю вам сделать это:

if (Gdx.input.isKeyJustPressed(Input.Keys.W) && isPlayerOnGround)
      player.b2body.applyLinearImpulse(new Vector2(0, 4f), player.b2body.getPosition(), true);

используя контакт с миром, мы определяем, находится ли игрок на земле

world.setContactListener(new () {
            @Override
            public void endContact(Contact c) {

                Fixture fa = c.getFixtureA();
                Fixture fb = c.getFixtureB();

                /* end Contact
                 * <<Player>> <---> <<Gound>>
                 */
                if(fa.getUserData() !=null && fb.getUserData() !=null && 
                           ((fa.getUserData().equals(playerUserData) && fb.getUserData().equals(groundUserData)) || 
                             fb.getUserData().equals(playerUserData) && fa.getUserData().equals(groundUserData)))
                {
                        isPlayerOnGround = false;
                }
            }
            @Override
            public void beginContact(Contact c) {

                Fixture fa = c.getFixtureA();
                Fixture fb = c.getFixtureB();

                /* Begin Contact
                 *  * <<Player>> <---> <<Gound>>
                 */
                if(fa.getUserData() !=null && fb.getUserData() !=null && 
                           ((fa.getUserData().equals(playerUserData) && fb.getUserData().equals(groundUserData)) || 
                             fb.getUserData().equals(playerUserData) && fa.getUserData().equals(groundUserData)))
                {
                        isPlayerOnGround = true;
                }
            }
        });

надеюсь было понятно и полезно :=)

person Netero    schedule 24.10.2015
comment
Да, это было :) Большое спасибо! - person Tobls; 24.10.2015

вот как вы можете добавить userData в тело

... // Define your bodyDef
Body body = world.createBody(bodyDef);
... // Define your fixtureDef   
Fixture fixture = body.createFixture(fixtureDef);
String userData ="MyBody";
fixture.setUserData(userData);

когда вы помещаете определение приспособления в свое тело, вы можете получить приспособление, просто поместив пользовательские данные (уникальная строка ex: «mybody») в приспособление

PS: Вы можете поместить одни и те же пользовательские данные во многие тела (группу тел), если хотите.

person Netero    schedule 27.10.2015
comment
Хорошо, теперь это сработало, но это не имеет значения. Вы знаете другой метод? - person Tobls; 27.10.2015
comment
что вы имеете в виду, что это работает, но не имеет значения? ты не мог сделать второй прыжок? не могли бы вы объяснить, что работает, а что нет ;) - person Netero; 27.10.2015