Todavía soy nuevo en la programación de Java y Android y tengo muchos problemas para eliminar un objeto cuando se produce una colisión. Miré alrededor de la web y descubrí que nunca debería manejar la eliminación de cuerpos BOX2D durante la detección de colisión (un detector de contactos) y debería agregar mis objetos a una lista de arrays y establecer una variable en la sección de Datos de usuario del cuerpo para eliminar o no y manejar la acción de eliminación en un controlador de actualización. Así que hice esto: Primero defino dos ArrayLists, una para las caras y otra para los cuerpos:
ArrayList<Sprite> myFaces = new ArrayList<Sprite>();
ArrayList<Body> myBodies = new ArrayList<Body>();
Luego, cuando creo una cara y la conecto a su cuerpo, las agrego a sus ArrayLists de esta manera:
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);
ahora agrego un detector de contactos y un controlador de actualizaciones en la escena de carga como esta:
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) {
}
});
Mi plan es detectar qué dos cuerpos colisionaron en el oyente de contacto marcando una variable de la sección de datos del usuario del cuerpo, obtener sus números en la lista de la matriz y finalmente usar el controlador de actualización para eliminar estos cuerpos.
Las preguntas son: ¿Estoy usando la lista de arrays correctamente? Cómo agregar una variable a los datos del usuario (el código por favor). Intenté eliminar un cuerpo en este controlador de actualización, pero todavía me arroja NullPointerException, entonces, ¿cuál es la forma correcta de agregar un controlador de actualización y dónde debo agregarlo? Cualquier otro consejo para hacer esto sería genial. Gracias por adelantado.
Si desea agregar un
isDead
indicador a sus datos de usuario, simplemente agréguelo a lo que establezca como datos de usuario cuando cree elBody
.Luego, en la
endContact()
bandera, los cuerpos que quieres estar muertos como muertos:Luego, asegúrese de eliminar los objetos muertos
update()
. No hagas esto mientras el PhysicsWorld se está actualizando:fuente