Andengine: различение между OnAreaTouched и OnSceneTouched

Всем привет,

в игре, которую я разрабатываю с помощью AndEngine, бегает много спрайтов. Теперь у каждого из этих спрайтов естьTouchArea , зарегистрированная в сцене, потому что я отображаю некоторую информацию о спрайте при касании. Сама сцена имеетOnSceneTouchListener , который я использую для перемещения камеры и масштабирования.

Моя проблема в том, что каждый раз, когда пользователь перемещает камеру (касаясь где-нибудь на дисплее и перемещая палец), методOnAreaTouched()любого спрайта, случайно оказавшегося под пальцем, получает называется, когда движение закончено (палец поднимается). Я уже ограничил триггерные события до event.getAction()==UP(до того, как это был настоящий беспорядок с вызываемыми touchAreas), но этого недостаточно. Если пользователь масштабирует или перемещает камеру, спрайты touchAreas не должны активироваться.

Можно ли как-то отличить событие OnAreaTouchedот события OnSceneTouched? Какой из них вызывается первым и могу ли я подавить другой?

Это мой метод OnSceneTouched()(упрощенный):

public boolean onSceneTouchEvent(Scene scene, final TouchEvent event) {
    boolean isZooming = event.getMotionEvent().getPointerCount() >= 2;
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // REMEMBER FIRST TOUCHPOINT, TO KNOW IN WHICH DIRECTION TO MOVE
        this.touchPoint = new Point(event.getMotionEvent().getX(), event.getMotionEvent().getY());  
    } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
        if (isZooming) {
            // DO SOME ZOOM STUFF
        } else {
            // DO SOME MOVEMENT STUFF
        }
        return true;
    }

Хорошо, на самом деле это не очень интересно, но, как видите, я всегда возвращаю true, чтобы сигнализировать о том, что событие касания было обработано.Тем не менее вызывается OnAreaTouched()

Это типичный OnAreaTouched()метод спрайта:

public boolean onAreaTouched(final TouchEvent touchEvent, float touchAreaLocalX, float touchAreaLocalY) {
    if (touchEvent.getAction() == TouchEvent.ACTION_UP) {
          // DISPLAY INFORMATION ABOUT THE SPRITE
          return true;
    }
    return false;
}

Видите ли, в этом нет ничего особенного. Поэтому я надеюсь, что кто-то может помочь мне найти решение, как подавить событие OnAreaTouch, когда следует использовать событие OnSceneTouch. Может быть, я могу как-то поймать event.getAction()==UPв методе OnSceneTouched()??

Надеюсь, я смог объяснить проблему достаточно хорошо, чтобы вы поняли (извините, для меня это не так просто : ). Любая помощь очень ценится, и спасибо за ваше время!

с уважением
Кристоф

редактировать:

После экспериментов с предложением MahdeTo каким-то образом пометить событие я обнаружил следующее:

  • метод TouchEvent, который запускает OnSceneTouchEvent()не то же самое, что и запускающий метод OnAreaTouched().
  • OnAreaTouched()вызывается на 20 мс позже, чем OnSceneTouchEvent()
  • событие, вызывающее OnAreaTouched(), начинается фактически, когда пользователь кладет палец на дисплей (чем он перемещает его, и OnSceneTouchEvent()вызывается несколько раз), когда он затем поднимает палец, первое событие останавливается и обрабатывается. (Я попробовал это, измерив время)

Итак, я придумал решение для измерения того, как долго длилось событие касания. Если событие длится более 200 мс, я предполагаю, что пользователь хотел не просто щелкнуть, а переместить или масштабировать (потому что эти действия обычно занимают больше времени).Итак, теперь метод OnAreaTouched()вызывается только тогда, когда кто-то действительно хотел щелкнутьи случайно не провел пальцем по области.

, ноэто все еще не очень хорошее решение, и я был бы очень признателен, если бы кто-нибудь знал больше об управлении такими событиями.

спасибо

6
задан GameDroids 21 June 2012 в 15:39
поделиться