Aufgrund meiner geringen Erfahrung mit box2d in libgdx kann es manchmal schwierig sein, Probleme mit Ausnahmen zu isolieren und zu lösen, die nur durch den neuesten Port verschlechtert wurden. Vor 2.2.1 konnte ich ohne Synchronisierungsprobleme, wie sie auftreten, problemlos Körper aus der Welt entfernen, aber nach der Migration auf den libgdx-Build, der 2.2.1 unterstützt, wurden dieselben Probleme angezeigt. Die Problemumgehung für mich, die von mehreren Personen vorgeschlagen wurde, war, dass Sie keine Körper aus der Welt entfernen können, während die Welt möglicherweise simuliert wird.
Gibt es eine Möglichkeit, dass Sie versuchen, einen Körper aus der Welt zu entfernen, wenn die Welt betreten wird? Wenn Sie dies versuchen, gefällt es box2d im Grunde nicht. Sie müssen also nur Körper außerhalb des entfernen world.step
. Was ich getan habe, war eine Utility-Klasse für den Körper .userData
mit einem Bool isFlaggedForDelete, die außerhalb der world.step-Methode überprüft wird.
public void sweepDeadBodies() {
for (Iterator<Body> iter = CURRENT_WORLD.getBodies(); iter.hasNext();) {
Body body = iter.next();
if(body!=null) {
YourCustomUserData data = (YourCustomUserData) body.getUserData();
if(data.isFlaggedForDelete) {
CURRENT_WORLD.destroyBody(body);
body.setUserData(null);
body = null;
}
}
}
Wenn Sie so etwas direkt nach Ihrem world.step ausführen, sollte es funktionieren. Setzen Sie in Ihrem Code, in dem Sie versuchen, den Körper zu zerstören, einfach .isFlaggedForDelete auf true, damit er vor dem nächsten world.step entfernt wird.