【问题标题】:Libgdx box2d Tiled mapLibgdx box2d 平铺地图
【发布时间】:2016-01-24 02:17:40
【问题描述】:

我有一个问题: 我正在用 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。 但是当他撞到地面时,他会慢半秒左右,因为他在空中变得更快。我该如何解决?

我的第二个任务是: 当我在击中地面后立即跳跃并再次按下跳跃时,角色不会跳跃! 为什么以及如何解决这个问题?

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

【问题讨论】:

  • 我想知道您的问题是否已解决,如果是,请您通过选择正确答案将您的问题转为已解决,谢谢

标签: libgdx box2d tiled


【解决方案1】:

但是当他落地时,他会慢半秒左右 因为他在空中飞得很快。我该如何解决?

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

希望这清楚且有帮助:=)

【讨论】:

  • 天哪 :) 非常感谢!
【解决方案2】:

这就是如何将 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:如果你愿意,你可以将相同的 userData 放到多个 body(一组 body)中。

【讨论】:

  • 好的,现在可以了,但没有什么不同。你知道另一种方法吗?
  • 你的意思是它有效但没有任何区别?你不能做第二跳?你能解释一下什么是炒锅,什么不是;)
猜你喜欢
  • 2016-07-08
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2016-06-04
相关资源
最近更新 更多