0
发生什么事每个人,如何处理libGDX的Box2D ContactListener中的空指针异常?
我通过libGDX在Box2D启发式地生产Pong克隆。空指针异常来自ContactListener的beginContact()方法,我试图实现评分逻辑。
Box2D世界使用两个独立的EdgeShapes作为传感器,用于在与球碰撞时递增得分变量(查看附加图像)。 Ball和两个EdgeShapes之间的碰撞逻辑工作正常,但Ball2和Box2D世界中的任何其他碰撞都会使程序崩溃。
堆栈跟踪:
Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.ckq3r.Pong.screens.GameScreen$2.beginContact(GameScreen.java:491)
at com.badlogic.gdx.physics.box2d.World.beginContact(World.java:876)
at com.badlogic.gdx.physics.box2d.World.jniStep(Native Method)
at com.badlogic.gdx.physics.box2d.World.step(World.java:602)
at com.ckq3r.Pong.screens.GameScreen.render(GameScreen.java:99)
at com.badlogic.gdx.Game.render(Game.java:46)
at com.ckq3r.Pong.PongGame.render(PongGame.java:236)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:204)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:112)
有问题的代码:
/**Box2D contact listener**/
private void createContactListener() {
world.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
Fixture fixtureA = contact.getFixtureA();
Fixture fixtureB = contact.getFixtureB();
Gdx.app.log("beginContact", "between " + fixtureA.toString() + " and " + fixtureB.toString());
if(fixtureA.getBody().getUserData().equals(1) && fixtureB.getBody().getUserData().equals(2) || fixtureA.getBody().getUserData().equals(2) && fixtureB.getBody().getUserData().equals(1)){
Gdx.app.log("HIT", "goal1 contact");
score1++;
score1String = score1 + "";
}
if(fixtureA.getBody().getUserData().equals(1) && fixtureB.getBody().getUserData().equals(3) || fixtureA.getBody().getUserData().equals(3) && fixtureB.getBody().getUserData().equals(1)){
Gdx.app.log("HIT", "goal2 contact");
score2++;
score2String = score2 + "";
}
}
@Override
public void endContact(Contact contact) {
Fixture fixtureA = contact.getFixtureA();
Fixture fixtureB = contact.getFixtureB();
Gdx.app.log("endContact", "between " + fixtureA.toString() + " and " + fixtureB.toString());
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
});
}
注:
- 当我注释掉beginContact中的两个条件语句() 我代码运行。未注释时,错误被重现。
- Ball userData是circleBody.setUserData(1);
- goal1 userData是goalBody.setUserData(2);
- goal2 userData是goalBody.setUserData(3);
这是行491? – JBuenoJr
下面的一个或多个函数返回'null':fixtureA.getBody()或fixtureA.getBody()。getUserData()或等效的fixtureB方法。应该getBody()或getUserData()总是返回一个值?如果他们返回null,这意味着什么? – HeatfanJohn
@JosephBueno第491行是beginContact()方法中的第一条if语句。谢谢回复。 – HACKQ3R