Domanda

Sono ancora nuovo a Java e Android di programmazione e sto avendo così tanti problemi Rimozione di un oggetto quando collisione accade. Ho guardato tutto il web e ha scoperto che non avrei mai dovuto gestire la rimozione di corpi Box2D durante il rilevamento di collisione (un ascoltatore di contatto) e devo aggiungere i miei oggetti a un ArrayList e impostare una variabile nella sezione Dati utente del corpo per eliminare o meno e maniglia l'azione rimozione in un gestore di aggiornamento. Così ho fatto questo: Per prima cosa ho definisco due ArrayLists uno per i volti e uno per i corpi:

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

Poi, quando creo un volto e collego quel viso al suo corpo li aggiungere alla loro ArrayLists in questo modo:

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

Ora aggiungo un ascoltatore di contatto e un gestore di aggiornamento nella onloadscene in questo modo:

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

}
});

Il mio piano è quello di individuare quale due corpi collisione nell'ascoltatore contatto controllando una variabile dalla sezione dati utente del corpo, ottenere i loro numeri nell'elenco matrice e infine utilizzare il gestore aggiornamento per rimuovere tali organismi.

Le domande sono: Sto usando l'arraylist correttamente? e in chi ascolta collisione come recuperare l'oggetto che si scontrò dalla lista array? Come aggiungere una variabile al Dati utente (il codice per favore). Ho provato a rimuovere un corpo in questo gestore aggiornamento ma mi butta ancora un NullPointerException, quindi qual è il modo giusto per aggiungere un gestore di aggiornamento e dove dovrei aggiungerlo? Eventuali altri consigli per fare questo sarebbe grande. Grazie in anticipo.

È stato utile?

Soluzione

Typically you would look at the user data for the two things that collided to decide if something should be deleted, and put those to be deleted in the list. Then after the time step, go through the list and delete them, and clear the list ready for the next time step.

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

So while you do need to have a list available to use, you don't need to put all the bodies into it when they are created.

The user data can be a class you make yourself, so you can make it contain whatever you like. Since you have the list to tell you which bodies are flagged for deletion, you don't need to have a flag for this in the user data. Besides, it would be inefficient to loop through every body in the world after every time step to check a flag in the user data.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top