2011-09-06 21 views
6

Sono ancora nuovo nella programmazione Java e Android e sto avendo così tanti problemi Rimozione di un oggetto in caso di collisione. Ho guardato intorno al web e ho scoperto che non avrei mai dovuto rimuovere i corpi BOX2D durante il rilevamento delle collisioni (un ascoltatore di contatti) e dovrei aggiungere i miei oggetti a un arraylist e impostare una variabile nella sezione Dati utente del corpo da eliminare o meno gestire l'azione di rimozione in un gestore di aggiornamento. Così ho fatto questo: Per prima cosa definire due ArrayLists uno per i volti e uno per i corpi:Rimozione di un oggetto in caso di collisione

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 come questo :

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 come questo:

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 rilevare whic h due corpi sono entrati in collisione nel listener dei contatti controllando una variabile dalla sezione dei dati utente del corpo, ottenendo i loro numeri nell'elenco di array e infine utilizzando il gestore di aggiornamento per rimuovere questi corpi.

Le domande sono: Sto usando l'arrayylist correttamente? e nel listener di collisioni come recuperare l'oggetto che è entrato in collisione dall'elenco di array? Come aggiungere una variabile ai Dati utente (il codice per favore). Ho provato a rimuovere un corpo in questo gestore di aggiornamento, ma mi getta ancora una NullPointerException, quindi qual è il modo giusto per aggiungere un gestore di aggiornamento e dove dovrei aggiungerlo? Qualsiasi altro consiglio per farlo sarebbe grandioso. Grazie in anticipo.

risposta

4

In genere si guardano i dati dell'utente per le due cose che sono entrati in collisione per decidere se qualcosa deve essere eliminato e mettere quelli da eliminare nell'elenco. Quindi, dopo la fase temporale, scorrere l'elenco ed eliminarli e cancellare l'elenco pronto per il passaggio successivo.

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

Così, mentre si ha bisogno di avere un elenco a disposizione da usare, non c'è bisogno di mettere tutti i corpi in esso al momento della creazione.

I dati dell'utente possono essere una classe che tu stesso fai, in modo che tu possa farne contenere quello che vuoi. Dal momento che hai la lista per dirti quali corpi sono contrassegnati per la cancellazione, non è necessario avere un flag per questo nei dati utente. Inoltre, sarebbe inefficiente passare attraverso ogni corpo del mondo dopo ogni passo temporale per controllare un flag nei dati dell'utente.

+0

grazie per la vostra risposta è molto utile – Ayham

Problemi correlati