Удаление объекта, когда происходит столкновение

StackOverflow https://stackoverflow.com/questions/7322250

  •  27-10-2019
  •  | 
  •  

Вопрос

Я все еще новичок в программировании Java и Android, и у меня столько проблем с удалением объекта, когда происходит столкновение. Я осмотрел сеть и обнаружил, что никогда не должен обрабатывать снятие тел Box2D во время обнаружения столкновений (слушатель контактов), и я должен добавить свои объекты в ArrayList и установить переменную в разделе пользовательских данных для удаления или нет и обрабатывать Удаление действия в обработчике обновления. Итак, я сделал это: сначала я определяю два аристалиста один для лиц и один для тел:

ArrayList<Sprite> myFaces = new ArrayList<Sprite>();
ArrayList<Body> myBodies = new ArrayList<Body>();

Затем, когда я создаю лицо и соединяю это лицо к его телу, я добавляю их в их арестовы, как это:

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, так как же правильно добавить обработчик обновлений и куда его добавить? Любые другие советы по этому поводу были бы здоровы. Заранее спасибо.

Это было полезно?

Решение

Как правило, вы смотрите на пользовательские данные для двух вещей, которые столкнулись, чтобы решить, следует ли что -то удалить, и поместить их для удаления в списке. Затем после временного шага пройдите через список и удалите их, и очистите список, готовый к следующему шагу.

{//game loop
    do world step //contacts occur in here, some bodies may be put in the list
    make sure list contents are unique
    go thru list and delete contents
    clear the list
}

Поэтому, хотя вам нужно иметь доступный список для использования, вам не нужно вкладывать в него все тела, когда они создаются.

Пользовательские данные могут быть классом, который вы делаете сами, так что вы можете заставить его содержать все, что вам нравится. Поскольку у вас есть список, чтобы сообщить вам, какие тела помечены для удаления, вам не нужно иметь флаг для этого в пользовательских данных. Кроме того, было бы неэффективно проходить через каждое тело в мире после каждого шага, чтобы проверить флаг в пользовательских данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top