Question

Je suis encore nouveau à la programmation Java et Android et je tant de mal La suppression d'un objet lors de la collision se produit. Je regardais sur le web et a trouvé que je ne manipulez jamais retirer les corps BOX2D lors de la détection de collision (un écouteur de contact) et je dois ajouter mes objets à un ArrayList et définir une variable dans la section Données d'utilisateur du corps à supprimer ou non et poignée la suppression de l'action dans un gestionnaire de mise à jour. Donc, je l'ai fait: D'abord, je définir deux ArrayLists une pour les visages et un pour les corps:

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

Puis, quand je crée un visage et connecter ce visage à son corps je les ajouter à leurs ArrayLists 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 ajouter un écouteur de contact et un gestionnaire de mise à jour dans le 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 les deux corps sont entrés en collision dans l'auditeur de contact en cochant une variable de la section de données utilisateur du corps, obtenir leur numéro dans la liste de tableau et enfin utiliser le gestionnaire de mise à jour pour supprimer ces corps.

Les questions sont les suivantes: Suis-je utiliser correctement le arraylist? et l'auditeur de collision comment récupérer l'objet qui est entré en collision dans la liste de tableau? Comment ajouter une variable aux données de l'utilisateur (le code s'il vous plaît). J'ai essayé de retirer un corps dans ce gestionnaire de mise à jour mais il me jette encore un NullPointerException, alors quelle est la bonne façon d'ajouter un gestionnaire de mise à jour et où dois-je ajouter? Tous les autres conseils pour ce faire serait génial. Merci à l'avance.

Était-ce utile?

La solution

En général, vous regarderiez les données utilisateur pour les deux choses qui se sont heurtés à décider si quelque chose doit être supprimé, et de mettre ceux à supprimer dans la liste. Puis, après l'étape de temps, passer par la liste et les supprimer et effacer la liste prête pour la prochaine étape de temps.

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

Ainsi, alors que vous avez besoin d'avoir une liste disponible à l'utilisation, vous n'avez pas besoin de mettre tous les corps dans quand ils sont créés.

Les données de l'utilisateur peut être une classe que vous faites vous-même, vous pouvez le faire contenir tout ce que vous aimez. Puisque vous avez la liste pour vous dire que les corps sont marqués pour la suppression, vous n'avez pas besoin d'avoir un drapeau pour cela dans les données de l'utilisateur. Par ailleurs, il serait inefficace de boucle à travers tous les corps dans le monde après chaque pas de temps pour vérifier un drapeau dans les données de l'utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top