Pregunta

Todavía soy nuevo en la programación de Java y Android y tengo tantos problemas para eliminar un objeto cuando ocurre la colisión. Miré alrededor de la web y descubrí que nunca debía manejar la eliminación de cuerpos Box2D durante la detección de colisiones (un oyente de contacto) y debería agregar mis objetos a una lista de matrices y establecer una variable en la sección de datos del usuario del cuerpo para eliminar o no manejar y manejar La acción de eliminación en un controlador de actualización. Así que hice esto: primero defino dos listas de matrices 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 conecto esa cara con su cuerpo, los agrego a sus listas de matriz como esta:

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 oyente de contacto y un controlador de actualización en el ondoteScene como este:

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 chocaron en el oyente de contacto verificando una variable de la sección de datos del usuario del cuerpo, obtener sus números en la lista de matriz y finalmente usar el controlador de actualización para eliminar estos cuerpos.

Las preguntas son: ¿estoy usando correctamente la ArrayList? ¿Y en el oyente de colisión cómo recuperar el objeto que chocó de la lista de matrices? 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 una nullpointerException, entonces, ¿cuál es la forma correcta de agregar un controlador de actualización y dónde debería agregarlo? Cualquier otro consejo para hacer esto sería genial. Gracias por adelantado.

¿Fue útil?

Solución

Por lo general, miraría los datos del usuario de las dos cosas que colisionaron para decidir si algo debe eliminarse, y ponerlos para eliminarlos en la lista. Luego, después del paso de tiempo, revise la lista y elimínelos, y borre la lista lista para el próximo paso de tiempo.

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

Entonces, si bien necesita tener una lista disponible para usar, no necesita poner todos los cuerpos en ella cuando se creen.

Los datos del usuario pueden ser una clase que usted mismo hace, por lo que puede hacer que contenga lo que desee. Dado que tiene la lista para decirle qué cuerpos están marcados para la eliminación, no necesita tener una bandera para esto en los datos del usuario. Además, sería ineficiente recorrer todos los cuerpos del mundo después de cada paso de tiempo para verificar una bandera en los datos del usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top