Libgdx box2d平铺地图

时间:2015-10-24 17:19:17

标签: libgdx box2d tiled

我有一个问题: 我正在使用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);
    }

因此玩家的最高速度为2。 但当他击中地面时,他会慢下半秒钟,因为他在空中紧固。我怎么解决这个问题?

我的第二个任务是: 当我跳到goround后我跳起并再次按下跳跃时,角色不会跳! 为什么以及如何解决这个问题?

希望你能帮助我,并提前致谢!

2 个答案:

答案 0 :(得分:1)

  

但是当他击中地面时,他的速度会慢一半左右   因为他紧紧抓住了。我怎么解决这个问题?

我认为这是因为摩擦,尝试在创建身体时将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;
                }
            }
        });

希望这是明确和有用的:=)

答案 1 :(得分:0)

这是您可以将 userData 添加到正文

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

当您将灯具定义放入您的身体时,您可以获得灯具 只需将userdata(唯一字符串ex:&#34; mybody&#34;)放入灯具

即可

PS:如果需要,可以将相同的userData放到许多实体(一组实体)中。