Мультитач игровое управление андроид

Это то, что не относится конкретно к программированию игр, поэтому я и спрашиваю здесь. В принципе, у меня есть этот код:

for (int i = 0; i < event.getPointerCount(); i++) {
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_POINTER_DOWN:
                    if(event.getPointerId(i) == 0)
                    {
                        Log.d("Game", "Primary Down");
                    }
                    else if(event.getPointerId(i) == 1)
                    {
                        Log.d("Game", "Secondary Down");
                    }
                    break;

                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_POINTER_UP:
                    if(event.getPointerId(i) == 0)
                    {
                        Log.d("Game", "Primary Up");
                    }
                    else if(event.getPointerId(i) == 1)
                    {
                        Log.d("Game", "Secondary Up");
                    }                      
                    break;  
                }
            }

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

Проблема, с которой я столкнулся с этим кодом, заключалась в том, что если первичный и вторичный указатели оба опущены, и любой из них отпущен, он активирует оба случая, поэтому выводятся как «Первичный вверх», так и «Вторичный вверх», второй освобожден узнает, какой именно, если оба случая сработают до того, как я туда доберусь, то в этот момент это не будет иметь значения. Любая идея, как исправить что-то подобное? Или другой способ сделать мультитач для игры, или что-то в этом роде. Спасибо!

Уолдо


person WWaldo    schedule 09.07.2011    source источник


Ответы (1)


Насколько мне известно, ACTION_UP и ACTION_POINTER_UP (и то же самое для XX_DOWN...) вызываются только один раз для каждого указателя. Таким образом, вам не нужно выполнять эту специальную обработку, просто используйте event.getX() и event.getY(). Чтобы получить соответствующий pointerId, вы должны использовать

int index = event.getActionIndex();
int pointerId = event.getPointerId(index);

Единственный раз, когда я использую цикл for, — это событие ACTION_MOVE, которое вызывается независимо от того, какой указатель перемещен (и в этом случае вам действительно нужно использовать pointerId, getX(i) и getY(i) )

изменить: getActionIndex был добавлен только в API 8, поэтому вы можете использовать

event.getAction() >> MotionEvent.ACTION_POINTER_INDEX_SHIFT

чтобы получить индекс действия.

person Gregory    schedule 09.07.2011
comment
так вы говорите, что я должен убрать цикл for и просто иметь операторы if, проверяющие переменную pointerId, которую вы указали в своем ответе? - person WWaldo; 09.07.2011
comment
Я предполагаю, что да, потому что теперь он отлично работает, большое спасибо! - person WWaldo; 09.07.2011