Как удалить простое тело в JBox2D?

#libgdx #box2d #jbox2d

#libgdx #box2d #jbox2d

Вопрос:

Всякий раз, когда я пытаюсь уничтожить тело в JBox2D, оно всегда выдает мне исключение NullPointerException, и я проверил онлайн, и они показывают различные способы сделать это «безопасно», которые я не понимаю. Мне было интересно, может ли кто-нибудь ввести какой-нибудь простой псевдокод, чтобы показать, как вы уничтожили бы тело в Box2D. Я также использую API LibGDX.

Вот мой код, который я использую:

 public void render(float delta) {

    if(bodiesContainer.size() > 0)
    {
        for(Body body:bodiesContainer)
        {
            world.destroyBody(body);
        }
    }

    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


    stage.act(delta);
    stage.draw();


    world.step(TIMESTEP, VELOCITYITERATIONS, POSITIONITERATIONS);

    camera.update();

    debugRenderer.render(world, camera.combined);

    batch.begin();
    batch.end();

}

 public void show() {
    // TODO Auto-generated method stub
    batch = new SpriteBatch();
    camera = new OrthographicCamera(Gdx.graphics.getWidth()/5, Gdx.graphics.getHeight()/5);
    world = new World(new Vector2(0,0f), true);
    debugRenderer = new Box2DDebugRenderer();
    stage = new Stage();

    particleCreator = new ParticleCreator(0, 0, 1);
    particleCreator.destroyParticle(world, particleBody);

    if (particleCreator == null)
    {
        System.out.println("true");
    }

    if (particleBody == null)
    {
        System.out.println("true particleBody");
    }

    if (particleBodyDef == null)
    {
        System.out.println("true particleBodyDef");
    }


    Gdx.input.setInputProcessor(new InputProcessor() {

        @Override
        public boolean touchUp(int arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean touchDragged(int arg0, int arg1, int arg2) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean touchDown(int arg0, int arg1, int arg2, int arg3) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean scrolled(int arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean mouseMoved(int arg0, int arg1) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean keyUp(int arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean keyTyped(char arg0) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean keyDown(int keycode) {
            switch(keycode) {
            case Keys.SPACE:

                break;
            }
            return false;
        }
    });
}

public class ParticleCreator 
{   



//Default constructor
public ParticleCreator()
{

}

public ParticleCreator(World world, BodyDef bodyDef, Body body, float position_x, float position_y, float particle_radius)
{
    bodyDef = new BodyDef();
    bodyDef.type = BodyType.DynamicBody;
    bodyDef.position.set(position_x, position_y);

    CircleShape circleShape = new CircleShape();
    circleShape.setRadius(particle_radius);

    FixtureDef fixtureDef = new FixtureDef();
    fixtureDef.shape = circleShape;
    fixtureDef.restitution = 0;

    body = world.createBody(bodyDef);
    body.createFixture(fixtureDef);
}

public void destroyParticle(World world, Body body)
{
    world.destroyBody(body);
    System.out.println("This Particle has been destroyed !!!");
}

}
  

bodiesContainer — это список массивов, а particleBody — это тело JBox2D, которое я хочу уничтожить, но каждый раз, когда я нажимаю пробел, происходит сбой и выдается исключение NullPointerException.

Комментарии:

1. Почему вы говорите о телах JBox2D? Кажется, это стандартный класс ядра libgdx. Вы действительно запускаете его в браузере через GWT, и это проблема JBox2D для конкретной платформы? Также было бы неплохо, если бы вы могли сказать, что именно вызывает нулевой указатель. Какой объект null ?

2. Да, извините, я хотел сказать тела libgdx, я запускаю это и в eclipse. Я решил быть более структурированным в своем программировании и решил использовать отдельный класс для particlebody, именно поэтому я создал класс particleCreator. Однако, когда я помещаю несколько инструкций print test, я обнаруживаю, что мое particleBody равно null, чего я не понимаю. Я перередактировал и включил необходимый код выше. И исключение возникает в этой строке particleCreator.destroyParticle(мир, тело частицы);

3. Не используйте инструкции print для чего-то подобного. Узнайте, как использовать отладчик. Установите точку останова в важных местах и выполните свой код шаг за шагом и проверьте, почему это происходит null .

4. Я не знаю, как это использовать, но возможно ли, чтобы вы указали, где я ошибся?

5. Ваш код не имеет особого смысла. Вы уничтожаете это тело-частицу в методе show, даже не задавая ему никакого значения. Оно всегда равно null.