Nadal jestem nowy w programowaniu w Javie i Androidzie i mam tak duże problemy z usunięciem obiektu, gdy nastąpi kolizja. Rozejrzałem się po Internecie i stwierdziłem, że nigdy nie powinienem radzić sobie z usuwaniem ciał BOX2D podczas wykrywania kolizji (detektor kontaktów) i powinienem dodać moje obiekty do tablicy arraylist i ustawić zmienną w sekcji Dane użytkownika, aby usunąć lub nie i obsługiwać operacja usuwania w module obsługi aktualizacji. Zrobiłem to: Najpierw definiuję dwie ArrayLists, jedną dla twarzy i jedną dla ciał:
ArrayList<Sprite> myFaces = new ArrayList<Sprite>();
ArrayList<Body> myBodies = new ArrayList<Body>();
Następnie, gdy tworzę twarz i łączę tę twarz z jej ciałem, dodaję je do ich ArrayLists w następujący sposób:
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);
teraz dodaję detektor kontaktów i moduł obsługi aktualizacji w scenie onloadscene w następujący sposób:
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) {
}
});
Moim planem jest wykrycie, które dwa ciała zderzyły się w detektorze kontaktów, poprzez sprawdzenie zmiennej z sekcji danych użytkownika w ciele, uzyskanie ich numerów na liście tablic i na koniec użycie programu do aktualizacji, aby usunąć te ciała.
Pytania są następujące: Czy prawidłowo korzystam z tablicy arraylist? Jak dodać zmienną do danych użytkownika (proszę o kod). Próbowałem usunąć ciało w tym module obsługi aktualizacji, ale nadal generuje mnie wyjątek NullPointerException, więc jaki jest właściwy sposób dodania modułu obsługi aktualizacji i gdzie powinienem go dodać. Wszelkie inne rady, aby to zrobić, byłyby świetne. Z góry dziękuję.
Jeśli chcesz dodać
isDead
flagę do danych użytkownika, po prostu dodaj ją do wszystkiego, co ustawisz jako dane użytkownika podczas tworzeniaBody
.Następnie we
endContact()
flagach ciała, które chcesz być martwe jak martwe:Następnie usuń martwe obiekty
update()
. Nie rób tego, gdy PhysicsWorld aktualizuje:źródło