Ich bin noch neu in der Java- und Android-Programmierung und habe so viele Probleme, ein Objekt zu entfernen, wenn eine Kollision auftritt. Ich habe mich im Internet umgesehen und festgestellt, dass ich niemals BOX2D-Körper während der Kollisionserkennung entfernen sollte (ein Kontakt-Listener) und meine Objekte zu einer Arrayliste hinzufügen und im Abschnitt Benutzerdaten des Körpers eine Variable festlegen sollte, die gelöscht oder nicht gelöscht werden soll die Entfernungsaktion in einem Update-Handler. Also habe ich Folgendes getan: Zuerst definiere ich zwei ArrayLists, eine für die Gesichter und eine für die Körper:
ArrayList<Sprite> myFaces = new ArrayList<Sprite>();
ArrayList<Body> myBodies = new ArrayList<Body>();
Wenn ich dann ein Gesicht erstelle und dieses Gesicht mit seinem Körper verbinde, füge ich sie wie folgt zu ihren ArrayLists hinzu:
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);
Jetzt füge ich der Onloadscene einen Kontakt-Listener und einen Update-Handler hinzu:
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) {
}
});
Mein Plan ist es, zu erkennen, welche zwei Körper im Kontakt-Listener kollidierten, indem ich eine Variable aus dem Benutzerdatenbereich des Körpers überprüfe, ihre Nummern in der Array-Liste abrufe und schließlich den Körper mit dem Update-Handler entferne.
Die Fragen sind: Benutze ich die Arrayliste richtig? So fügen Sie den Benutzerdaten eine Variable hinzu (der Code bitte). Ich habe versucht, einen Body in diesem Update-Handler zu entfernen, aber es löst immer noch eine NullPointerException aus. Was ist also der richtige Weg, um einen Update-Handler hinzuzufügen, und wo soll ich ihn hinzufügen? Alle anderen Ratschläge dazu wären großartig. Danke im Voraus.
Wenn Sie
isDead
Ihren Benutzerdaten ein Flag hinzufügen möchten, fügen Sie es einfach zu dem hinzu , was Sie beim Erstellen des als Benutzerdaten festgelegt habenBody
.Dann in
endContact()
Flagge die Körper, die Sie tot sein wollen, als tot:Stellen Sie dann sicher, dass Sie die toten Objekte entfernen
update()
. Tun Sie dies nicht, während die PhysicsWorld aktualisiert wird:quelle