2016-05-26 27 views
1

Ich habe Probleme bei der Implementierung von Multi-Touch-ich habe für eine Weile gesucht. Die aktuelle Implementierung funktioniert, unterbricht jedoch andere Eingaben. Dieser Code ist Teil meines Eingabesteuerers, der Eingabebereiche handhabt/zeichnet. Das Bewegungsereignis wird über diese Funktion von OnTouchEvent() übergeben, Ich habe gelesen, dass Sie Zeiger-ID verwenden müssen, um ordnungsgemäß zu verfolgen, aber jedes Mal wenn ich versuche, es zu implementieren, liegt der Zeigerindex außerhalb des Bereichs. ich könnte wirklich etwas Hilferichtig handhaben Multi-Touch-Event android

public void handleInput(MotionEvent motionEvent,LevelManager l, SoundManager sound, Viewport vp){ 
    int pointerCount = motionEvent.getPointerCount(); 
    for (int i = 0; i < pointerCount; i++) { 
     int x = (int) motionEvent.getX(i); 
     int y = (int) motionEvent.getY(i); 
     if(l.isPlaying()) { 

      switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { 

       case MotionEvent.ACTION_DOWN: 
        if (right.contains(x, y)) { 
         l.player.setPressingRight(true); 
         l.player.setPressingLeft(false); 
        } else if (left.contains(x, y)) { 
         l.player.setPressingLeft(true); 
         l.player.setPressingRight(false); 
        } else if (jump.contains(x, y)) { 
         l.player.startJump(sound); 
        } else if (shoot.contains(x, y)) { 
         if(l.player.pullTrigger()){ 
          sound.playSound("shoot"); 
         } 
        } else if (pause.contains(x, y)) { 
         l.switchPlayingStatus(); 

        } 

        break; 


       case MotionEvent.ACTION_UP: 
        if (right.contains(x, y)) { 
         l.player.setPressingRight(false); 
        } else if (left.contains(x, y)) { 
         l.player.setPressingLeft(false); 
        } 


        break; 


       case MotionEvent.ACTION_POINTER_DOWN: 
        if (right.contains(x, y)) { 
         l.player.setPressingRight(true); 
         l.player.setPressingLeft(false); 
        } else if (left.contains(x, y)) { 
         l.player.setPressingLeft(true); 
         l.player.setPressingRight(false); 
        } else if (jump.contains(x, y)) { 
         l.player.startJump(sound); 
        } else if (shoot.contains(x, y)) { 
         if(l.player.pullTrigger()){ 
          sound.playSound("shoot"); 
         } 
        } else if (pause.contains(x, y)) { 
         l.switchPlayingStatus(); 
        } 
        break; 


       case MotionEvent.ACTION_POINTER_UP: 
        if (right.contains(x, y)) { 
         l.player.setPressingRight(false); 
        } else if (left.contains(x, y)) { 
         l.player.setPressingLeft(false); 
        } else if (shoot.contains(x, y)) { 
         //Handle shooting here 
        } else if (jump.contains(x, y)) { 
         //Handle more jumping stuff here later 
        } 
        break; 
      } 
     }else {// Not playing 
      //Move the viewport around to explore the map 
      switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_DOWN: 
        if (right.contains(x, y)) { 
         vp.moveViewportRight(l.mapWidth); 
        } else if (left.contains(x, y)) { 
         vp.moveViewportLeft(); 
        } else if (jump.contains(x, y)) { 
         vp.moveViewportUp(); 
        } else if (shoot.contains(x, y)) { 
         vp.moveViewportDown(l.mapHeight); 
        } else if (pause.contains(x, y)) { 
         l.switchPlayingStatus(); 
        } 
        break; 
      } 



     } 
    } 

} 

Antwort

0

OK verwende ich eine Antwort gefunden, mit MotionEventCompat ich in der Lage war, das gewünschte Verhalten zu erreichen, indem Sie einen Index und Weitergabe im Fall durch die MotionEventCompat Schnittstelle hinzugefügt wird.

 int index = MotionEventCompat.getActionIndex(motionEvent); 
     int x = (int) MotionEventCompat.getX(motionEvent, index); 
     int y = (int) MotionEventCompat.getY(motionEvent, index); 

statt int x = (int) motionEvent.getX(i); int y = (int) motionEvent.getY(i); direkt nach

 for (int i = 0; i < pointerCount; i++) { 

dies scheint wie eine solche Mistery mir ehrlich zu sein, fühlt es wirklich Hacky, ich bin nicht einmal sicher, durch beide Zeiger, wenn Iterieren jetzt notwendig ist, . i werde versuchen und kommentieren zurück

// bearbeiten die for-Schleife sicher redundant ist, ich musste nur um sicher machen, bevor ich mich in Verlegenheit weiter

+0

ich war richtig, die for-Schleife nun überflüssig ist. es fühlt sich seltsam an, aber ich werde damit gehen, – naahn