Ainda sou novo na programação java e android e estou tendo muitos problemas para remover um objeto quando ocorre uma colisão. Eu olhei pela web e descobri que nunca deveria lidar com a remoção de corpos do BOX2D durante a detecção de colisão (um ouvinte de contato) e devo adicionar meus objetos a uma lista de matrizes e definir uma variável na seção Dados do usuário do corpo para excluir ou não manipular a ação de remoção em um manipulador de atualização. Então, fiz o seguinte: Primeiro defino duas ArrayLists, uma para as faces e outra para os corpos:
ArrayList<Sprite> myFaces = new ArrayList<Sprite>();
ArrayList<Body> myBodies = new ArrayList<Body>();
Então, quando eu crio uma face e conecto essa face ao seu corpo, eu as adiciono às suas ArrayLists assim:
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);
agora eu adiciono um ouvinte de contato e um manipulador de atualização no onloadscene como este:
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) {
}
});
Meu plano é detectar quais dois corpos colidiram no ouvinte de contatos, verificando uma variável da seção de dados do usuário, colocar seus números na lista de matriz e finalmente usar o manipulador de atualizações para remover esses corpos.
As perguntas são: Estou usando o arraylist corretamente? Como adicionar uma variável aos dados do usuário (o código, por favor). Tentei remover um corpo neste manipulador de atualizações, mas ele ainda me lança NullPointerException, então qual é a maneira correta de adicionar um manipulador de atualizações e onde devo adicioná-lo. Quaisquer outros conselhos para fazer isso seriam ótimos. Desde já, obrigado.
Se você deseja adicionar um
isDead
sinalizador aos dados do usuário, basta adicioná-lo ao que você definir como dados do usuário ao criar oBody
.Em seguida,
endContact()
sinalize os corpos que você deseja que estejam mortos como mortos:Em seguida, certifique-se de remover os objetos mortos
update()
. Não faça isso enquanto o PhysicsWorld estiver atualizando:fonte