2015-12-02 40 views
0

我的遊戲輸入有問題。在我的遊戲中,有一個遊戲杆和兩個按鈕。我已經覆蓋了onTouchEvent方法的輸入。 onTouchEvent更改了類中另一個方法處理的一些變量。onTouchEvent在多點觸摸上的錯誤座標android

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    boolean touched = false; 
    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_MOVE: 
     case MotionEvent.ACTION_DOWN: 
      touched = true; 
      if ((event.getX() < Constants.JOYSTICK_SIZE * Data.density) && (event.getY() > (Data.height - Constants.JOYSTICK_SIZE * Data.density))) { 
       xPos = Math.round(event.getX()); 
       yPos = Math.round(event.getY()); 
       joystickPressed = true; 
      } 
      if ((event.getX() > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY() > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
       button1Pressed = true; 
      } 
      if ((event.getX() > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY() > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY() < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
       button2Pressed = true; 
      } 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      touched = true; 
      if ((event.getX(event.getActionIndex()) < Constants.JOYSTICK_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.JOYSTICK_SIZE * Data.density))) { 
       xPos = Math.round(event.getX()); 
       yPos = Math.round(event.getY()); 
       joystickPressed = true; 
      } 
      if ((event.getX(event.getActionIndex()) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
       button1Pressed = true; 
      } 
      if ((event.getX(event.getActionIndex()) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY() < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
       button2Pressed = true; 
      } 
      break; 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_CANCEL: 
      if ((event.getX() > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY() > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
       button1Pressed = false; 
      } else if ((event.getX() > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY() > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY() < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
       button2Pressed = false; 
      } else { 
       xPos = Math.round(Constants.JOYSTICK_SIZE/2 * Data.density); 
       yPos = Math.round(Data.width - Constants.JOYSTICK_SIZE/2 * Data.density); 
       joystickPressed = false; 
      } 
      break; 
     case MotionEvent.ACTION_POINTER_UP: 
      if ((event.getX(event.getActionIndex()) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
       button1Pressed = false; 
      } else if ((event.getX(event.getActionIndex()) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY() < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
       button2Pressed = false; 
      } else { 
       xPos = Math.round(Constants.JOYSTICK_SIZE/2 * Data.density); 
       yPos = Math.round(Data.width - Constants.JOYSTICK_SIZE/2 * Data.density); 
       joystickPressed = false; 
      } 
      break; 
    } 
    return touched || super.onTouchEvent(event); 
} 

但是似乎存在問題。當屏幕上只有一個指針時,代碼工作正常,或者先按下操縱桿。但是,當首先按下其中一個按鈕時,代碼似乎給出遊戲杆的xPos和yPos的錯誤座標。當移動操縱桿時,它也會影響按鈕。

我的代碼有什麼問題?任何幫助/建議,將不勝感激。

回答

0

你必須在你的onTouch事件中獲得像這樣的正確接觸點。

float xPos = event.getRawX()-v.getX(); 
    float yPos = event.getRawY()-v.getY(); 
+0

什麼會是V? – Increditastic

+0

你已經設置觸摸監聽器的視圖 – Arslan

+0

但我的觀點是SurfaceView,感謝的方式 – Increditastic

0

修正了這一點:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    boolean touched = false; 
    switch (event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
      touched = true; 
      if ((event.getX() < Constants.JOYSTICK_SIZE * Data.density) && (event.getY() > (Data.height - Constants.JOYSTICK_SIZE * Data.density))) { 
       xPos = Math.round(event.getX()); 
       yPos = Math.round(event.getY()); 
       joystickPressed = true; 
      } 
      if ((event.getX() > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY() > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
       shootPressed = true; 
      } 
      if ((event.getX() > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY() > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY() < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
       superpunchPressed = true; 
      } 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touched = true; 
      for(int i = 0; i < event.getPointerCount(); ++i){ 
       if ((event.getX(i) < Constants.JOYSTICK_SIZE * Data.density) && (event.getY(i) > (Data.height - Constants.JOYSTICK_SIZE * Data.density))) { 
        xPos = event.getX(i); 
        yPos = event.getY(i); 
        joystickPressed = true; 
       } 
       if ((event.getX(i) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(i) > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
        shootPressed = true; 
       } 
       if ((event.getX(i) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(i) > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY(i) < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
        superpunchPressed = true; 
       } 
      } 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      touched = true; 
      if ((event.getX(event.getActionIndex()) < Constants.JOYSTICK_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.JOYSTICK_SIZE * Data.density))) { 
       xPos = event.getX(event.getActionIndex()); 
       yPos = event.getY(event.getActionIndex()); 
       joystickPressed = true; 
      } 
      if ((event.getX(event.getActionIndex()) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
       shootPressed = true; 
      } 
      if ((event.getX(event.getActionIndex()) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY(event.getActionIndex()) < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
       superpunchPressed = true; 
      } 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_CANCEL: 
      if ((event.getX() > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY() > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
       shootPressed = false; 
      } else if ((event.getX() > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY() > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY() < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
       superpunchPressed = false; 
      } else { 
       xPos = Constants.JOYSTICK_SIZE/2 * Data.density; 
       yPos = Data.width - Constants.JOYSTICK_SIZE/2 * Data.density; 
       joystickPressed = false; 
      } 
      break; 
     case MotionEvent.ACTION_POINTER_UP: 
      if ((event.getX(event.getActionIndex()) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.BUTTON_SIZE * Data.density))) { 
       shootPressed = false; 
      } else if ((event.getX(event.getActionIndex()) > Data.width - Constants.BUTTON_SIZE * Data.density) && (event.getY(event.getActionIndex()) > (Data.height - Constants.BUTTON_SIZE * Data.density * 2 - 20 * Data.density)) && (event.getY(event.getActionIndex()) < (Data.height - Constants.BUTTON_SIZE * Data.density - 20 * Data.density))) { 
       superpunchPressed = false; 
      } else { 
       xPos = Constants.JOYSTICK_SIZE/2 * Data.density; 
       yPos = Data.width - Constants.JOYSTICK_SIZE/2 * Data.density; 
       joystickPressed = false; 
      } 
      break; 
    } 
    return touched || super.onTouchEvent(event); 
}