Da minha pouca experiência com o box2d na libgdx, às vezes pode ser difícil isolar e resolver problemas com exceções que só foram agravadas pela última porta. Antes da 2.2.1, eu podia remover facilmente corpos do mundo sem problemas de sincronização, como você está enfrentando, mas depois de migrar para a libgdx build que suportava a 2.2.1, comecei a ver os mesmos problemas. A solução alternativa para mim, sugerida por várias pessoas, foi que você não pode remover corpos do mundo enquanto o mundo estiver sendo simulado.
Existe a possibilidade de você tentar remover um corpo do mundo quando o mundo está sendo pisado? Basicamente, se você tentar fazer isso, o box2d não gosta, então o que você precisa fazer é remover os corpos fora do world.step
. O que fiz foi adicionar uma classe de utilidade para o corpo .userData
com um bool isFlaggedForDelete que seria verificado fora do método world.step.
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;
}
}
}
Se você executar algo assim logo após o seu world.step, ele deverá funcionar. No seu código em que você está tentando destruir o corpo, defina-o como .isFlaggedForDelete como true e ele será removido antes do próximo world.step.