в игре, которую я разрабатываю с помощью 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()
вызывается только тогда, когда кто-то действительно хотел щелкнутьи случайно не провел пальцем по области.
, ноэто все еще не очень хорошее решение, и я был бы очень признателен, если бы кто-нибудь знал больше об управлении такими событиями.
спасибо