2011-09-06 28 views
6

Todavía soy nuevo en la programación de Java y Android y me cuesta tanto eliminar un objeto cuando ocurre una colisión. Miré alrededor de la web y encontré que nunca deberí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 arrays y establecer una variable en la sección Datos de usuario del cuerpo para eliminar o no manejar la acción de eliminación en un controlador de actualización. Así que hice esto: Primero definir dos ArrayLists uno de los rostros y otra para los cuerpos:Eliminar un objeto cuando ocurre una colisión

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

Luego, cuando creo una cara y conecto esa cara a su cuerpo los agrego a sus ArrayLists como este :

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 añadir un detector de contacto y un controlador de actualización en el onloadscene así:

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 whic h Dos cuerpos colisionaron en el oyente de contacto al verificar una variable de la sección de datos del usuario del cuerpo, obtener sus números en la lista de matriz y finalmente utilizar el controlador de actualización para eliminar estos cuerpos.

Las preguntas son: ¿Estoy utilizando correctamente el arraylist? y en el oyente de colisión cómo recuperar el objeto que colisionó de la lista de matriz? Cómo agregar una variable a los Datos del usuario (el código por favor). Traté de eliminar un cuerpo en este controlador de actualización, pero aún así me arroja una 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 de antemano.

Respuesta

4

Normalmente miraría los datos del usuario para las dos cosas que colisionaron para decidir si algo debería eliminarse, y los puso para eliminarlos en la lista. Luego, después del paso de tiempo, revise la lista y elimínelos, y borre la lista para el siguiente paso.

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

Así que mientras usted no necesita tener una lista disponible para su uso, que no es necesario poner todos los cuerpos en ella cuando se crean.

Los datos de usuario pueden ser de una clase que usted mismo crea, para que pueda hacer que contenga lo que quiera. Como tiene la lista para decirle qué cuerpos están marcados para su eliminación, no necesita tener un indicador para esto en los datos del usuario. Además, sería ineficiente pasar por todos los cuerpos del mundo después de cada paso para verificar un indicador en los datos del usuario.

+0

gracias por su respuesta es muy útil – Ayham

Cuestiones relacionadas