2013-05-11 71 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; 
} 

編輯: 這很複雜!我發現了一些我修改了一些的代碼。我需要爲每個開始在屏幕上繪製形狀的人創建一個arrayList。幾名球員必須有可能同時畫出形狀。所有點值應存儲在player arrayList中。最後,所有player arrayList應該存儲在名爲players的主arrayList中。我可以得到一些幫助來解決這個問題嗎?我不知道如何開始。

我宣佈我列出了GameLoop類:

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

下面的代碼是在MainActivity類和我使用的GameLoopgameLoop對象與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>>將指針ID映射到該指針的列表Points。

下面是MotionEvent與例如我上面張貼指南:

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

編輯:試圖把代碼符合你的需求:

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

感謝您的信息!看起來很複雜(後面我會詳細討論) – 2013-05-11 07:53:57

+0

沒有那麼複雜,你有一個運動位置的歷史,大小爲getHistorySize(),並且在每個歷史記錄中都有'getPointerCount()'指針。可以通過使用'getHistoricalX(pointer,history)'來查看給定歷史事件中每個指針的位置,然後你需要做的就是將正確的事件放在正確的列表中,每個指針,這就是'HashMap' – tbkn23 2013-05-11 07:58:26

+0

你好,我想了解你的代碼示例我可以使用arrayLists而不是hashMaps嗎? – 2013-05-14 07:11:53