Frage

Ich bin immer noch neu in Java und Android -Programmierung und habe so viel Probleme, ein Objekt zu entfernen, wenn Kollision stattfindet. Ich habe mich im Internet umgesehen und festgestellt, dass ich niemals das Entfernen von Box2D -Körpern während der Kollisionserkennung (ein Kontakthörer) abschließen sollte, und ich sollte meine Objekte einer Arraylist hinzufügen und eine Variable im Bereich Benutzerdaten des Körpers zum Löschen oder nicht verhandeln und verarbeiten und verarbeiten Die Entfernung der Aktion in einem Update -Handler. Also habe ich Folgendes gemacht: Zuerst definiere ich zwei Arraylisten für die Gesichter und einen 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 zu ihren Arraylisten wie folgt 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 einen Kontakthörer und einen Update -Handler in der Onloadscene wie folgt 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 Kontakthörer kollidiert haben, indem sie eine Variable aus dem Bereich Benutzerdaten des Körpers überprüfen, ihre Zahlen in die Array -Liste erhalten und schließlich den Aktualisierungshandler verwenden, um diese Körper zu entfernen.

Die Fragen sind: Verwende ich die ArrayList richtig? Und im Kollisionshörer wie kann man das Objekt abrufen, das aus der Array -Liste kollidierte? So fügen Sie den Benutzerdaten eine Variable hinzu (bitte der Code). Ich habe versucht, einen Körper in diesem Update -Handler zu entfernen, aber er wirft mir 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, dies zu tun, wären großartig. Danke im Voraus.

War es hilfreich?

Lösung

In der Regel würden Sie die Benutzerdaten für die beiden Dinge betrachten, die kollidierten, um zu entscheiden, ob etwas gelöscht werden sollte, und diese in die Liste gelöscht werden. Gehen Sie dann nach dem Zeitschritt die Liste durch und löschen Sie sie und löschen Sie die Liste für den nächsten Zeitschritt bereit.

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

Während Sie also eine Liste zur Verfügung haben müssen, müssen Sie nicht alle Körper einsetzen, wenn sie erstellt werden.

Die Benutzerdaten können eine Klasse sein, die Sie selbst herstellen, sodass Sie das enthalten, was Sie möchten. Da Sie über die Liste verfügen, um Ihnen mitzuteilen, welche Körper für das Löschen von Löschen gekennzeichnet sind, müssen Sie in den Benutzerdaten kein Flag dafür haben. Außerdem wäre es ineffizient, nach jedem Zeitschritt jeden Körper der Welt zu durchlaufen, um ein Flag in den Benutzerdaten zu überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top