Libgdx联系监听器--联系不能双向使用

问题描述 投票:1回答:1

我正在使用LibGDX和Box2D开发一款游戏,今天我实现了硬币作为动态体,并想让玩家通过我的ContactListener读取接触来获得金币。

到目前为止,一切都很正常,这是我在ContactListener类中玩家与梯子对象碰撞的例子。

@Override
public void beginContact(Contact contact) {
    Fixture fixA = contact.getFixtureA();
    Fixture fixB = contact.getFixtureB();

    int cDef = fixA.getFilterData().categoryBits | fixB.getFilterData().categoryBits;


    switch (cDef) {
        case Constants.PLAYER_BIT | Constants.LADDER_BIT:
            if (fixA.getFilterData().categoryBits == Constants.PLAYER_BIT) {
                    ((HeroKnight) fixA.getUserData()).climbLadder();
            }
            else {
                    ((HeroKnight) fixB.getUserData()).climbLadder();
                }

然而,奇怪的是,金币的碰撞只有一种方式。

case Constants.PLAYER_BIT | Constants.COIN_BIT:
            if (fixA.getFilterData().categoryBits == Constants.PLAYER_BIT) {
                ((CoinTest) fixB.getUserData()).use();
            }

当我添加else语句时,如下图所示,游戏一直用java.lang.NullPointerException崩溃。

case Constants.PLAYER_BIT | Constants.COIN_BIT:
            if (fixA.getFilterData().categoryBits == Constants.PLAYER_BIT) {
                ((CoinTest) fixB.getUserData()).use();
            }
            else  {
                ((CoinTest) fixA.getUserData()).use();
            }

玩家类的fixturedef maskbits包括coin,coin类的maskbits也包括玩家(一切都和地面、平台、梯子等一样,问题只存在于这里)。

我希望我解释的足够好,这是我在这里的第一个问题。

java libgdx box2d
1个回答
1
投票

我终于解决了这个问题。有这么一个菜鸟的错误,我完全忽略了,没想到会造成这样的问题。解决方法就是在ContactListener中添加 "break "语句。这样一来,就没有任何问题了。

       switch (cDef) {
        case Constants.PLAYER_BIT | Constants.LADDER_BIT:
            if (fixA.getFilterData().categoryBits == Constants.PLAYER_BIT) {
                    ((HeroKnight) fixA.getUserData()).climbLadder();
            }
            else {
                ((HeroKnight) fixB.getUserData()).climbLadder();
                }
            break;
        case Constants.PLAYER_BIT | Constants.GROUND_BIT:
        case Constants.PLAYER_BIT | Constants.PLATFORM_BIT:
            if (fixA.getFilterData().categoryBits == Constants.PLAYER_BIT) {
                ((HeroKnight) fixA.getUserData()).ground();
            }
            else {
                ((HeroKnight) fixB.getUserData()).ground();
            }
            break;
        case Constants.PLAYER_BIT | Constants.COIN_BIT:
            if (fixA.getFilterData().categoryBits == Constants.PLAYER_BIT) {
                ((CoinTest) fixB.getUserData()).use();
                ((HeroKnight) fixA.getUserData()).collectGold(10);
            }
            else  {
                ((CoinTest) fixA.getUserData()).use();
                ((HeroKnight) fixB.getUserData()).collectGold(10);
            }
            break;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.