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>
答案 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);
与块相同。
您还应该考虑使用一些列表而不是数组。