#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.