Удаление объекта при столкновении - PullRequest
6 голосов
/ 06 сентября 2011

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

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

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

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) {

}
});

Я планирую определить, какие два тела столкнулись в прослушивателе контактов, проверивпеременную из раздела пользовательских данных тела, найдите их номера в списке массивов и, наконец, используйте обработчик обновлений для удаления этих тел.

Вопросы: правильно ли я использую массив?и в слушателе столкновений, как извлечь объект, который столкнулся из списка массивов?Как добавить переменную в Данные пользователя (код, пожалуйста).Я попытался удалить тело в этом обработчике обновлений, но он по-прежнему выдает исключение NullPointerException, так как правильно добавить обработчик обновлений и где мне его добавить?Любые другие советы, чтобы сделать это было бы здорово.Заранее спасибо.

1 Ответ

4 голосов
/ 07 сентября 2011

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

{//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
}

Так что, хотя вам необходим список доступных для использования, вам не нужно помещать в него все тела при их создании.

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

...