AndEngine - Как обрабатывать onAreaTouched спрайта после его добавления в коллекцию спрайтов?

У меня есть коллекция спрайтов в Map

private Map<String, Sprite> sprite = new HashMap<String, Sprite>();

и все, что мне нужно, это подписаться на их событие onAreaTouched.

Моя попытка была примерно такой:

Sprite aSprite = new Sprite(i*128, 100, region.get("regionB"), context.getVertexBufferObjectManager()){
            @Override
            public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
                                         final float pTouchAreaLocalX,
                                         final float pTouchAreaLocalY) {
                this.setPosition(pSceneTouchEvent.getX() - this.getWidth() / 2, pSceneTouchEvent.getY() - this.getHeight() / 2);
                System.out.println(String.format("spriteB %fx%f", pSceneTouchEvent.getX(), pSceneTouchEvent.getY()));
                return true;
            }
        };

scene.attachChild(aSprite);
scene.registerTouchArea(aSprite);
sprite.put("spriteB",aSprite);

Что я здесь не так делаю и почему мой спрайт не реагирует на событие касания?

Спасибо.

В журнале я получаю это

06-10 15:11:51.598: V/AndEngine(1171): org.andengine.input.touch.TouchEvent$TouchEventPool<TouchEvent> was exhausted, with 0 item not yet recycled. Allocated 1 more.
06-10 15:11:51.598: V/AndEngine(1171): org.andengine.util.adt.pool.PoolUpdateHandler$1<TouchEventRunnablePoolItem> was exhausted, with 0 item not yet recycled. Allocated 1 more.

а потом куча таких строк

06-10 15:11:51.628: W/Trace(1171): Unexpected value from nativeGetEnabledTags: 0
06-10 15:11:51.688: W/Trace(1171): Unexpected value from nativeGetEnabledTags: 0
06-10 15:11:51.708: W/Trace(1171): Unexpected value from nativeGetEnabledTags: 0

person Constantin    schedule 10.06.2013    source источник
comment
Ваш код выглядит хорошо для меня, вы правильно зарегистрировали области касания на сцене. Если обработчик события касания не был вызван, я не думаю, что это вызвано вашей HashMap, проблема должна исходить из других мест. Вы переопределили какой-то код, связанный с сенсорным экраном, в вашей сцене или HUD? Например, onSceneTouchEvent, onAreaTouchEvent, onSceneTouchListener... и т. д.?   -  person 正宗白布鞋    schedule 10.06.2013
comment
я не отменял их. я действительно не понимаю :) все спрайты появляются на шнурах, которые я дал, но никакие сенсорные события не работают.   -  person Constantin    schedule 10.06.2013
comment
Я бы посоветовал вам отслеживать код из onSceneTouchEvent() в Scene.java. Убедитесь, что он вызывается, когда происходят события касания. Туда же отправляется метод onAreaTouched() спрайта.   -  person 正宗白布鞋    schedule 10.06.2013
comment
Спасибо за предложение. Я попробую сейчас.   -  person Constantin    schedule 10.06.2013
comment
Вы можете попробовать использовать прямой экземпляр активности, а затем вызвать для него метод getVertexBufferObjectManager(). Не используйте контекст.   -  person Siddharth    schedule 10.06.2013
comment
с прямым вызовом getVertexBufferObjectManager() в экземпляре действия он работает, но когда я передаю действие в качестве контекста, это не так.   -  person Constantin    schedule 10.06.2013


Ответы (1)


Замените «это» на «аспрайт». Возможно, вам придется объявить «aSprite» глобально поверх класса.

Заменять:

this.setPosition(pSceneTouchEvent.getX() - this.getWidth() / 2, pSceneTouchEvent.getY() - this.getHeight() / 2);

с этим:

aSprite.setPosition(pSceneTouchEvent.getX() - aSprite.getWidth() / 2, pSceneTouchEvent.getY() - aSprite.getHeight() / 2);

Изменить:

Попробуйте этот подход, я надеюсь, что это сработает. Обратите внимание, что я сохранил значение «i» внутри «id» и сделал его окончательным для использования внутри метода onAreaTouched(). Я думаю, это то, что вы ищете.

Sprite aSprite[] = new Sprite[spriteArrayLength];

for(i = 0; i < spriteArrayLength; i++){
    aSprite[i] = new Sprite(i*128, 100, region.get("regionB"), context.getVertexBufferObjectManager()){
        private final int id = i;
        @Override
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
                                     final float pTouchAreaLocalX,
                                     final float pTouchAreaLocalY) {
            aSprite[id].setPosition(pSceneTouchEvent.getX() - aSprite[id].getWidth() / 2, pSceneTouchEvent.getY() - aSprite[id].getHeight() / 2);
            System.out.println(String.format("spriteB %fx%f", pSceneTouchEvent.getX(), pSceneTouchEvent.getY()));
            return true;
        }
    };
}
person Nafis    schedule 17.06.2013
comment
Хорошо понял, но как заставить этот подход работать с for(){Sprite aSprite = new Sprite(...){}} Я имею в виду, что я генерирую несколько спрайтов, а затем собираю их на этой карте для последующего использования. , а также мне нужно, чтобы сенсорное событие работало. - person Constantin; 18.06.2013