2013-05-11 3 views
3

Я делаю простую игру, в которой игрок рисует фигуры на экране. Точки пути хранятся в массиве и нарисованы в классе GameLoop. Я почти закончил, но теперь я понимаю, что я должен был сделать игру с мульти сенсорным входом, чтобы позволить двум игрокам рисовать фигуры в одно и то же время!Не знаете, как обращаться с несколькими касаниями

Я знаю, что мне нужно использовать event.Action_Down для первого пальца и event.Action_Pointer_Down для следующего пальца, но как мне обрабатывать точки всех фигур и рисунок пути? Могу ли я использовать один массив, или мне нужен массив для каждого. Мне кажется, что мне нужно удвоить весь код в классе GameLoop, чтобы проверить оба пути? Мой вопрос может быть немного неясным, но это то, что я чувствую прямо сейчас! Некоторые советы были бы хороши!

Это код, как я обрабатывать одинарные события прикосновения и передавать все точки в массив:

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    synchronized (gameLoop) { 

     switch (event.getAction()) { 

     case MotionEvent.ACTION_DOWN: 
      gameLoop.touchDownX = event.getX(); 
      gameLoop.touchDownY = event.getY(); 
      break; 

     case MotionEvent.ACTION_MOVE: 
      Point point = new Point(); 
      point.x = (int) event.getX(); 
      point.y = (int) event.getY(); 
      gameLoop.addPoints(point); 
      gameLoop.startDrawLine = true; 
      break; 

     case MotionEvent.ACTION_UP: 
      Point point2 = new Point(); 
      point2.x = (int) gameLoop.touchDownX; 
      point2.y = (int) gameLoop.touchDownY; 
      gameLoop.addPoints(point2); // Add last point to close shape 
      gameLoop.pathOK = true; 
      gameLoop.touchActionUp = true; 
      break; 
     } 
    } 
    return true; 
} 

EDIT: Это было сложно! Я нашел код, который немного изменил. Мне нужно создать массивList для каждого человека, который начинает рисовать фигуру на экране. Одновременно должно быть возможно, чтобы несколько игроков рисовали фигуры. Все значения Point должны храниться внутри массива player. Наконец, все player arrayList должны храниться внутри основного списка элементов массива, называемого players. Могу ли я помочь решить эту проблему? Я не знаю, с чего начать.

Я объявил мои списки в классе GameLoop:

 // Lists to handle multiple touch input 
    players = new ArrayList<List<Point>>(); // Main arrayList 
    player = new ArrayList<Point>(); // Inner arrayList 

ниже код находится в классе MainActivity и я использую объект GameLoop как gameLoop общаться с методами GameLoop.

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    synchronized (gameLoop) { 

    for(int i=0; i<event.getPointerCount(); i++) { // Numbers of pointers on screen 

     int id = event.getPointerId(i); 

     // Check if fingers touch screen 
     if (event.getActionIndex() == i && (event.getActionMasked() == MotionEvent.ACTION_POINTER_UP || event.getActionMasked() == MotionEvent.ACTION_UP)) { 


     } 

     // Check if fingers leave the screen 
     else if (event.getActionIndex() == i && (event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN || event.getActionMasked() == MotionEvent.ACTION_DOWN)) { 


     } 

     // Check movement on screen 
     else { 

     } 
    } 
    } 
    return true; 
} 

ответ

0

Взгляните на этот пример, который обрабатывает историю движения всех указателей сразу:

void printSamples(MotionEvent ev) { 
    final int historySize = ev.getHistorySize(); 
    final int pointerCount = ev.getPointerCount(); 
    for (int h = 0; h < historySize; h++) { 
     System.out.printf("At time %d:", ev.getHistoricalEventTime(h)); 
     for (int p = 0; p < pointerCount; p++) { 
      System.out.printf(" pointer %d: (%f,%f)", 
      ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h)); 
     } 
    } 

    System.out.printf("At time %d:", ev.getEventTime()); 
    for (int p = 0; p < pointerCount; p++) { 
     System.out.printf(" pointer %d: (%f,%f)", 
     ev.getPointerId(p), ev.getX(p), ev.getY(p)); 
    } 
} 

Вы должны будете создать несколько массивов для нескольких указателей. Вы можете использовать HashMap<Integer, List<Point>> для сопоставления из идентификатора указателя в список Point s для этого указателя.

Вот руководство для MotionEvent с примером, я отправил выше:

http://developer.android.com/reference/android/view/MotionEvent.html

Edit: Пытался соответствовать коду вашим потребностям:

private HashMap<Integer, List<Point>> myPoints; 

private void addPoints(MotionEvent ev) { 
    final int historySize = ev.getHistorySize(); 
    final int pointerCount = ev.getPointerCount(); 
    for (int h = 0; h < historySize; h++) { 
     for (int p = 0; p < pointerCount; p++) { 
      addPoint(ev.getPointerId(p), new Point(ev.getHistoricalX(p, h), ev.getHistoricalY(p, h))); 
     } 
    } 

    System.out.printf("At time %d:", ev.getEventTime()); 
    for (int p = 0; p < pointerCount; p++) { 
     addPoint(ev.getPointerId(p), new Point(ev.getHistoricalX(p, h), ev.getHistoricalY(p, h))); 
    } 
} 

private void addPoint(Integer pointerId, Point point) { 
    List<Point> points = myPointers.get(pointerId); 

    if (points == null) { 
     points = new LinkedList<Point>(); 
     myPointers.put(pointerId, points); 
    } 

    myPointers.get(pointerId).add(point); 
} 
+0

Спасибо за информацию! Кажется очень сложным :(Я рассмотрю более подробно. –

+0

Не так сложно. У вас есть история местоположений движения размером 'getHistorySize()', и в каждой записи истории у вас есть указатели 'getPointerCount()'. Тогда вы может видеть местоположение каждого указателя в заданном событии истории с помощью 'getHistoricalX (указатель, история)'. Все, что вам нужно сделать, - поместить правильное событие в правильный список, за указатель, и это то, что 'HashMap' для – tbkn23

+0

Привет, снова! Я пытаюсь понять ваш пример кода. Могу ли я использовать списки массивов вместо hashMaps? –

Смежные вопросы