我正在使用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也包括玩家(一切都和地面、平台、梯子等一样,问题只存在于这里)。
我希望我解释的足够好,这是我在这里的第一个问题。
我终于解决了这个问题。有这么一个菜鸟的错误,我完全忽略了,没想到会造成这样的问题。解决方法就是在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;
}
}