gpt4 book ai didi

java - 删除后接触处理程序中的 Box2D 空夹具

转载 作者:行者123 更新时间:2023-12-01 12:56:50 25 4
gpt4 key购买 nike

我正在使用 Libgdx 的 box2d 实现。

从世界中删除主体后,我遇到空指针错误。我已将问题跟踪到我的接触监听器,我正在其中针对其他灯具测试灯具的过滤器,看看是否应该处理碰撞。问题是其中一个灯具为空。最初您会想,好吧,只处理非空夹具的碰撞,但如果我不知道结束接触的夹具是什么,就不可能知道什么正在接触非空夹具。

在进入代码之前,我保证通过将主体添加到稍后处理的队列中,在物理步骤之外进行实际的 world.destroyBody(body) 调用。此外,主体会在更新循环中排队,这发生在 world.step() 之前

(注意:实体基本上是主体的包装)

这是主更新循环

@Override
public void render() {
processDestroyQueue();

sm.update(); //Calls entity update functions, where the entity is added to the q
camera.update();


//Step
world.step(STEP, 6, 2); //Step == 1/60f

//... removed rendering stuff
}

这里是添加到队列函数和processDestroyQueue()

public void destroy(Entity ent){
destroyQueue.add(ent);
}

private void processDestroyQueue(){
Entity ent;
while((ent = destroyQueue.poll()) != null){
world.destroyBody(ent.body());
ent.dispose();
entities.remove(ent);
}
}

最后是联系人处理程序

public class ContactHandler implements ContactListener {

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

parseContact(true, fixA, fixB, contact);
}

@Override
public void endContact(Contact contact) {
Fixture fixA = contact.getFixtureA();
Fixture fixB = contact.getFixtureB();

parseContact(false, fixA, fixB, contact);
}

@Override
public void preSolve(Contact contact, Manifold oldManifold) {
// TODO Auto-generated method stub

}

@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
// TODO Auto-generated method stub

}

public void parseContact(boolean begin, Fixture fixA, Fixture fixB, Contact contact){
System.out.println("FixtureA: " + fixA);
System.out.println("FixtureB: " + fixB);
if( (fixA.getFilterData().categoryBits & fixB.getFilterData().maskBits) != 0 ){
sendContact(begin, fixA, fixB, contact);
sendContact(begin, fixB, fixA, contact);
}else if( (fixB.getFilterData().categoryBits & fixA.getFilterData().maskBits) != 0 ){
sendContact(begin, fixA, fixB, contact);
sendContact(begin, fixB, fixA, contact);
}
}

public void sendContact(boolean begin, Fixture fixA, Fixture fixB, Contact contact){
Object dataA = fixA.getUserData();
Object dataB = fixB.getUserData();

if(dataA instanceof FixtureData && dataB instanceof FixtureData){
FixtureData fixtureDataB = (FixtureData)dataB;
FixtureData fixtureDataA = (FixtureData)dataA;
fixtureDataA.contact(fixB, contact, begin);
fixtureDataB.contact(fixA, contact, begin);
}
}

}

最后的错误:

Exception in thread "LWJGL Application" java.lang.NullPointerException
at com.gearworks.game.ContactHandler.parseContact(ContactHandler.java:42)
at com.gearworks.game.ContactHandler.endContact(ContactHandler.java:24)
at com.badlogic.gdx.physics.box2d.World.endContact(World.java:903)
at com.badlogic.gdx.physics.box2d.World.jniDestroyBody(Native Method)
at com.badlogic.gdx.physics.box2d.World.destroyBody(World.java:322)
at com.gearworks.Client.processDestroyQueue(Client.java:189)
at com.gearworks.Client.render(Client.java:118)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:206)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

在我看来,Box2D 只是删除了固定装置,然后调度其结束接触事件。我需要该夹具处于最终接触状态,以便我知道哪个夹具已完成接触。我的实现是错误的吗?或者这就是 box2D 的工作原理,我需要找出其他方法?

最佳答案

这确实是 libgdx 中的一个错误:

https://github.com/libgdx/libgdx/issues/1381

https://github.com/libgdx/libgdx/pull/1837

我认为您只需要更新版本的源代码。

关于java - 删除后接触处理程序中的 Box2D 空夹具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23814987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com