接触发生时如何执行对象删除 Box2D LibGDX

问题描述 投票:0回答:1

我正在尝试处理射弹和敌人之间的碰撞。当射弹击中敌人时,它必须消失,但相反,游戏在接触的那一刻就崩溃了。我不知道如何解决这个问题

public class CollisionProcessing implements ContactListener {
    World world;

    public CollisionProcessing(World world) {
        super();
        this.world = world;
    }
    @Override
    public void beginContact(Contact contact) {}

    @Override
    public void endContact(Contact contact) {}

    @Override
    public void preSolve(Contact contact, Manifold manifold) {}

    @Override
    public void postSolve(Contact contact, ContactImpulse contactImpulse) {
        Fixture A = contact.getFixtureA();
        Fixture B = contact.getFixtureB();
        if (A == null || B == null) return;
        if (A.getUserData() == null || B.getUserData() == null) return;

        if (A.getUserData().equals(3)) {
            System.out.println("Bullet Body collision");
            A.getBody().setActive(false);
            world.destroyBody(A.getBody());
        }
        if (B.getUserData().equals(3)) {
            System.out.println("Body Bullet collision");
            B.getBody().setActive(false); // this
            world.destroyBody(B.getBody()); // and this commands cruch game when contact happens
        }
    }

我尝试过 world.destroyBody() 和 body.destroyFicture() 但没有帮助

java libgdx collision-detection box2d collision
1个回答
0
投票

您无法调用任何

destroy' functions in any of the **Box2D** callbacks as they occur in during the 
World.step` 更新。

相反,在

postSolve
中将主体添加到列表中,并在下次调用
World.step
之前,迭代该列表并调用
destroyBody

迭代后不要忘记清除列表。

© www.soinside.com 2019 - 2024. All rights reserved.