Я все еще новичок в программировании на Java и Android, и у меня так много проблем с удалением объекта при столкновении. Я посмотрел в Интернете и обнаружил, что никогда не должен обрабатывать удаление тел BOX2D во время обнаружения столкновений (прослушиватель контактов), и мне нужно добавить свои объекты в массив списков и установить переменную в разделе «Пользовательские данные» тела для удаления или обработки и обработки действие удаления в обработчике обновлений. Итак, я сделал это: сначала я определяю два списка ArrayList, один для лиц и один для тел:
ArrayList<Sprite> myFaces = new ArrayList<Sprite>();
ArrayList<Body> myBodies = new ArrayList<Body>();
Затем, когда я создаю лицо и соединяю это лицо с его телом, я добавляю их в свои списки ArrayList следующим образом:
face = new AnimatedSprite(pX, pY, pWidth, pHeight, this.mBoxFaceTextureRegion);
Body BoxBody = PhysicsFactory.createBoxBody(mPhysicsWorld, face, BodyType.DynamicBody, objectFixtureDef);
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, BoxBody, true, true));
myFaces.add(face);
myBodies.add(BoxBody);
Теперь я добавляю обработчик контактов и обработчик обновлений в onloadscene следующим образом:
this.mPhysicsWorld.setContactListener(new ContactListener() {
private AnimatedSprite face2;
@Override
public void beginContact(final Contact pContact) {
}
@Override
public void endContact(final Contact pContact) {
}
@Override
public void preSolve(Contact contact,Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact,ContactImpulse impulse) {
}
});
scene.registerUpdateHandler(new IUpdateHandler() {
@Override
public void reset() { }
@Override
public void onUpdate(final float pSecondsElapsed) {
}
});
Мой план состоит в том, чтобы определить, какие два тела столкнулись в прослушивателе контактов, проверив переменную из раздела пользовательских данных тела, получить их номера в списке массивов и, наконец, использовать обработчик обновления для удаления этих тел.
Вопросы: правильно ли я использую arraylist? Как добавить переменную в Данные пользователя (код, пожалуйста). Я попытался удалить тело в этом обработчике обновлений, но он все равно выбрасывает меня NullPointerException, так что как правильно добавить обработчик обновлений и где я должен его добавить. Любые другие советы, чтобы сделать это было бы здорово. Заранее спасибо.
Если вы хотите добавить
isDead
флаг в свои пользовательские данные, просто добавьте его к тому, что вы указали в качестве пользовательских данных при созданииBody
.Затем
endContact()
пометьте тела, которые вы хотите быть мертвыми как мертвые:Затем убедитесь, что вы удалите мертвые объекты в
update()
. Не делайте этого, пока обновляется PhysicsWorld:источник