在 libgdx 中碰撞时获得主体的空错误(虽然不是)



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);
}

} 这是一个视频,展示了发生的事情

好的,我想澄清一些事情,我的问题不是删除身体或物体,我在创建新块后遇到错误,当任何ballz与任何物体碰撞时(即使不是块),请大家观看视频以了解我在说什么顺便说一下,分数代表您可以在视频中看到的块上的数字

首先,您应该确保夹具不为空。我几乎 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 和块数组中的元素是不同类型的,如果不是,请使它们成为。 当然,为了使我的代码正常工作,您必须在创建灯具时设置灯具的用户数据。

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

也是如此。

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

最新更新