andengine удаляет коллекционные объекты, такие как спрайты

Я разрабатываю игру, используя andangine и расширения tmx и body2d. Я создаю объекты (спрайты), такие как монеты, в определенных позициях при создании моей карты. я использую contactlistener, чтобы проверить, сталкивается ли игрок с монетой.

как удалить этот спрайт? и как я могу лучше организовать свои спрайты? спасибо =)


person blub    schedule 25.11.2012    source источник


Ответы (2)


Я предполагаю, что вы создаете PhysicsConnector для связи между вашими спрайтами и телами. Создайте список этих физических соединителей, и когда вы решите удалить тело (и его спрайт), сделайте следующее:

Body bodyToRemove = //Get it from your contact listener
for(PhysicsConnector connector : mPhysicsConnectors) //mPhysicsConnectors is the list of your coins physics connectors.
    if(connector.getBody() == bodyToRemove)
        removeSpriteAndBody(connector); //This method should also delete the physics connector itself from the connectors list.

Об организации спрайтов: Монеты — это спрайты, которые можно использовать повторно, их не следует каждый раз создавать заново. Вы можете использовать пул объектов, вот вопрос по этой теме.

person Jong    schedule 25.11.2012
comment
в порядке. я сделал такой метод, как removeSpriteAndBody, но мое приложение вылетает при вызове этого метода. -25 23:50:51.869: E/AndroidRuntime(15700): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: UpdateThread 11-25 23:50:51.869: E/AndroidRuntime(15700): java.util.ConcurrentModificationException 11-25 23:50:51.869: E /AndroidRuntime(15700): в java.util.ArrayList$ArrayListIterator.next(ArrayList.java:576) - person blub; 26.11.2012
comment
попробуйте это: Iterator‹PhysicsConnectors› iterator = mPhysicsConnectors.iterator(); в то время как (iterator.hasNext()) { разъем = iterator.next(); if (connector.getBody() == needToRemove) { iterator.remove(); удалитьSpriteAndBody (соединитель); } } - person Aleksandrs; 26.11.2012
comment
Я тоже столкнулся с этой проблемой, когда реализовал нечто подобное в своей игре. Используйте то, что сказал Ракун, это должно сработать. - person Jong; 26.11.2012
comment
все та же ошибка, я думаю, это мой метод removeSpriteAndBody. protected void removeSpriteAndBody (соединитель PhysicsConnector) { physicsConnectors.remove (соединитель); scene.detachChild(connector.getShape()); - person blub; 26.11.2012
comment
вы удалили итератор перед вызовом removeSpriteAndBody? - person Aleksandrs; 26.11.2012

Я советую вам установить пользовательские данные тела. И в вашем обработчике столкновений вы сможете с этим работать. Небольшой пример:

body.setUserData(...);

..

    public void postSolve(Contact contact, ContactImpulse impulse) {

            ... bodyAType = (...) bodyA.getUserData();
            ... bodyBType = (...) bodyB.getUserData();
            if (bodyAType != null && bodyBType != null) {
               if (bodyAType.getUserData.equals(...)) {
                   //.......do what you need
               }
            }
    }
person SVS    schedule 26.11.2012