Je suis encore nouveau dans la programmation Java et Android et j'ai tellement de mal à supprimer un objet en cas de collision. J'ai regardé sur le Web et j'ai constaté que je ne devrais jamais gérer la suppression des corps BOX2D pendant la détection de collision (un écouteur de contacts) et que je devais ajouter mes objets à une liste de tableaux et définir une variable dans la section Données utilisateur du corps à supprimer ou non et à gérer l'action de suppression dans un gestionnaire de mise à jour. J'ai donc fait ceci: d'abord, je définis deux ArrayLists, une pour les visages et une pour les corps:
ArrayList<Sprite> myFaces = new ArrayList<Sprite>();
ArrayList<Body> myBodies = new ArrayList<Body>();
Ensuite, quand je crée un visage et que je connecte ce visage à son corps, je les ajoute à leurs listes de tableaux comme ceci:
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);
maintenant j'ajoute un écouteur de contacts et un gestionnaire de mise à jour dans la onloadscene comme ceci:
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) {
}
});
Mon plan est de détecter quels deux corps sont entrés en collision dans l'écouteur de contacts en vérifiant une variable dans la section des données utilisateur du corps, obtenir leurs numéros dans la liste de tableaux et enfin utiliser le gestionnaire de mise à jour pour supprimer ces corps.
Les questions sont les suivantes: est-ce que j'utilise correctement l'arraylist? Comment ajouter une variable aux données utilisateur (le code s'il vous plaît). J'ai essayé de supprimer un corps dans ce gestionnaire de mise à jour, mais cela me renvoie toujours NullPointerException, alors quelle est la bonne façon d'ajouter un gestionnaire de mise à jour et où dois-je l'ajouter. Tout autre conseil pour ce faire serait formidable. Merci d'avance.
Si vous souhaitez ajouter un
isDead
indicateur à vos données utilisateur, ajoutez-le simplement à tout ce que vous définissez comme données utilisateur lorsque vous créez leBody
.Puis dans
endContact()
drapeau les corps que vous voulez être morts comme morts:Assurez-vous ensuite de retirer les objets morts
update()
. Ne faites pas cela pendant la mise à jour de PhysicsWorld:la source