在libgdx

时间:2017-08-28 11:35:11

标签: java libgdx box2d

P.S。这会很长,所以我建议你在阅读本书的同时喝上午的咖啡

这是错误

 java.lang.NullPointerException: Attempt to invoke virtual method 'com.badlogic.gdx.physics.box2d.Body developer.io.aimzballz.Blocks.getBody()' on a null object reference 
at void developer.io.aimzballz.Gameplay.beginContact(com.badlogic.gdx.physics.box2d.Contact) (Gameplay.java:336)
at void com.badlogic.gdx.physics.box2d.World.beginContact(long) (World.java:985)
at void com.badlogic.gdx.physics.box2d.World.jniStep(long, float, int, int) (World.java:-2)
at void com.badlogic.gdx.physics.box2d.World.step(float, int, int) (World.java:689)
at void developer.io.aimzballz.Gameplay.render(float) (Gameplay.java:231)
 at void com.badlogic.gdx.Game.render() (Game.java:46)
at void developer.io.aimzballz.Main.render() (Main.java:34)
at void com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(javax.microedition.khronos.opengles.GL10) (AndroidGraphics.java:459)
at void android.opengl.GLSurfaceView$GLThread.guardedRun() (GLSurfaceView.java:1531)
 at void android.opengl.GLSurfaceView$GLThread.run() (GLSurfaceView.java:1248)

以及错误显示的部分

@Override
public void beginContact(Contact contact) {
    for (int i = 0; i < l;i++){
        for (int x = 0; x < k;x++){
             if ((contact.getFixtureA().getBody() == ballz[i].getBody() &&
                    contact.getFixtureB().getBody() == blocks[x].getBody()) ||
                    (contact.getFixtureB().getBody() == ballz[i].getBody() && contact.getFixtureA().getBody() == blocks[x].getBody())) {
                blocks[x].decreaseScore();
                if (blocks[x].getScore() <= 0) {
                    handler.removeObject(blocks[x]);
                    final Body toRemove = blocks[x].getBody();
                    Gdx.app.postRunnable(new Runnable() {
                        @Override
                        public void run() {
                            world.destroyBody(toRemove);
                        }
                    });
                }
            }
        }
    }
}

奇怪的部分是...这个错误有时会出现,有时候没有,不仅如此,我还按Timer安排了一项任务,它有时执行任务有时没有。
是时候在这里清除一些东西,ballz[]blocks[]是游戏对象(扩展名为GameObject的抽象类的类),如果你不能理解我的代码意味着什么我可以解释,但现在我想告诉你另一件事

private void translateBlocks(){
    for (int i = 0; i < k;i++){
        blocks[i].getBody().setLinearVelocity(0, 3);
    }
    Timer.schedule(new Timer.Task() {
        @Override
        public void run() {
            stopBlocks();
        }
    } , 0.75f);
}
private void stopBlocks(){
    for (int i = 0; i < k;i++){
        blocks[i].getBody().setLinearVelocity(0,0);
        created = false;
    }
    k = k + rnd.nextInt(2) + 1;
    diffOfK = k - diffOfK;
    createBlocks(k , diffOfK);
}

虽然k是现有的块数,createBlocks是听起来像  当一个来自ballz的对象在创建块后发生碰撞时,我得到了我在开始时显示的空错误  这一切我希望我解决了我的问题...如果我错过任何事情或者如果您对我的代码有任何疑问,请随时评论一下 的修改
处理程序类

public class Handler {

LinkedList<GameObject> object = new LinkedList<GameObject>();

public void render(ShapeRenderer renderer){
    for (GameObject tempObject : object) {
        tempObject.render(renderer);
    }
}
public void dispose(){
    for (GameObject gameObject : object){
        gameObject.dispose();
    }
}
public void textRender(SpriteBatch batch){
    for (GameObject gameObject : object){
        gameObject.textRender(batch);
    }
}

public void addObject(GameObject object){
    this.object.add(object);
}
public void removeObject(GameObject object){
    this.object.remove(object);
}

} 这是video显示发生的事情

好的我想澄清一些事情,我的问题不是移除尸体或物体,我在创建新的块后以及任何ballz与任何身体发生碰撞时出错(即使它& #39;不是块)并且看着视频来了解我所说的内容,顺便说一句,分数代表你在视频中可以看到的块上的数字 < / p>

1 个答案:

答案 0 :(得分:0)

首先,您应确保灯具不为空。我几乎100%确定你在迭代时遇到空块。

我会提出这种解决方案:

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

        if(fixA == null || fixB == null) return;

        if(fixA.getUserData() instanceof Ball || fixB.getUserData() instanceof Ball)
        {
            Fixture ballFixture = fixA.getUserData() instanceof Ball ? fixA : fixB;
            Fixture blockFixture = fixA.getUserData() instanceof Ball ? fixB : fixA;

            Block block = ((Block)blockFixture.getUserData());

            block.decreaseScore();
            //and all other functions
        }

    }

我认为ballz和blocks数组中的元素是不同类型的,如果不是,请将它们作为。 当然为了使我的代码工作,你必须在创建它们时设置灯具的用户数据。

body.createFixture(fixtureDef).setUserData(ball);

相同。

您还应该考虑使用一些列表而不是数组。