Libgdx null指针

时间:2015-11-01 13:12:47

标签: nullpointerexception libgdx box2d

我正在开发Box2D Jump并运行游戏,并且希望玩家在遇到尖峰时被传送到开头,但是当他击中尖峰时,我会得到一个空指针异常。

继承我的联系人课程:

public class WorldContactListener implements ContactListener {

Player player;

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

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

    switch (cDef) {
        case HardwareRunner.PLAYER_BIT | HardwareRunner.BRICK_BIT:
        case HardwareRunner.PLAYER_BIT | HardwareRunner.SPIKE_BIT:
            player.die();

    }
}

而且这是我的球员类的一部分:

public void definePlayer(){
    bdef.position.set(32 / runner.PPM, (6 * 32) / runner.PPM);
    bdef.type = BodyDef.BodyType.DynamicBody;
    b2body = world.createBody(bdef);

    FixtureDef fdef = new FixtureDef();
    PolygonShape shape = new PolygonShape();
    Vector2[] vertice = new Vector2[4];
    vertice[0] = new Vector2(-13, 13).scl(1 / runner.PPM);
    vertice[1] = new Vector2(13, 13).scl(1 / runner.PPM);
    vertice[2] = new Vector2(13, -13).scl(1 / runner.PPM);
    vertice[3] = new Vector2(-13, -13).scl(1 / runner.PPM);
    shape.set(vertice);
    shape.getRadius();
    fdef.filter.categoryBits = HardwareRunner.PLAYER_BIT;
    fdef.filter.maskBits =
            HardwareRunner.GROUND_BIT |
            HardwareRunner.COIN_BIT |
            HardwareRunner.BRICK_BIT |
            HardwareRunner.ENEMY_BIT |
            HardwareRunner.SPIKE_BIT |
            HardwareRunner.ENEMY_HEAD_BIT |
            HardwareRunner.ITEM_BIT;

    fdef.shape = shape;
    fdef.friction = .1f;
    b2body.createFixture(fdef).setUserData(this);
    fdef.isSensor = true;

    b2body.createFixture(fdef).setUserData(this);
}

public void die() {
    world.destroyBody(b2body);

    bdef.position.set(32 / runner.PPM, (6 * 32) / runner.PPM);
    bdef.type = BodyDef.BodyType.DynamicBody;
    b2body = world.createBody(bdef);

    FixtureDef fdef = new FixtureDef();
    PolygonShape shape = new PolygonShape();
    Vector2[] vertice = new Vector2[4];
    vertice[0] = new Vector2(-13, 13).scl(1 / runner.PPM);
    vertice[1] = new Vector2(13, 13).scl(1 / runner.PPM);
    vertice[2] = new Vector2(13, -13).scl(1 / runner.PPM);
    vertice[3] = new Vector2(-13, -13).scl(1 / runner.PPM);
    shape.set(vertice);
    shape.getRadius();
    fdef.filter.categoryBits = HardwareRunner.PLAYER_BIT;
    fdef.filter.maskBits =
            HardwareRunner.GROUND_BIT |
                    HardwareRunner.COIN_BIT |
                    HardwareRunner.BRICK_BIT |
                    HardwareRunner.ENEMY_BIT |
                    HardwareRunner.SPIKE_BIT |
                    HardwareRunner.ENEMY_HEAD_BIT |
                    HardwareRunner.ITEM_BIT;

    fdef.shape = shape;
    fdef.friction = .1f;
    b2body.createFixture(fdef).setUserData(this);
    fdef.isSensor = true;

    b2body.createFixture(fdef).setUserData(this);
}

错误是:

Exception in thread "LWJGL Application" java.lang.NullPointerException
at de.tobls.hardwarerunner.Sprites.Player.die(Player.java:223)
at de.tobls.hardwarerunner.Tools.WorldContactListener.beginContact(WorldContactListener.java:27)
at com.badlogic.gdx.physics.box2d.World.beginContact(World.java:982)
at com.badlogic.gdx.physics.box2d.World.jniStep(Native Method)
at com.badlogic.gdx.physics.box2d.World.step(World.java:686)
at de.tobls.hardwarerunner.Screens.PlayScreen.update(PlayScreen.java:112)
at de.tobls.hardwarerunner.Screens.PlayScreen.render(PlayScreen.java:127)
at com.badlogic.gdx.Game.render(Game.java:46)
at de.tobls.hardwarerunner.HardwareRunner.render(HardwareRunner.java:71)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:215)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

首先,你不应该在异步方法中销毁世界项目 - 注意联系人监听器的方法是异步的。

world.update()

之前,以正确的方式摧毁身体od以标记然后摧毁
    //in asynchronous method 
    body.setUserData("DESTROY");

    //when rendering
    for(Body body : world.getBodies())
            if(body.getUserData().equals("DESTROY")) world.destroyBody(body);

但是在这个问题的顶部 - 我发现除了移动身体以外你什么也没做,所以为什么不使用setTransform方法

    body.setTransform(new Vector2(newX, newY), body.getAngle() );

而不是移除身体并在新位置再次创建