2016-06-18 7 views
2

나는 총알을 던질 필요가있는 간단한 게임을 개발하려고합니다. 볼을 터치 또는 스 와이프 방향으로 따라오고 싶습니다.자바 Android onTouch 방향

그러나 나는 해결하는데 성공하지 못한 작은 문제가 있습니다.

I는 다음이 직선에 따른 공 이동하기 위해 직선의 방정식을 계산 MotionEventACTION_DOWN 좌표 및 MotionEventACTION_UP의 좌표를 가지고.

"위로"또는 "앞으로"또는 "앞에서"가까운 방향으로 스 와이프하면 볼이 번쩍이는 속도로 움직이며 다른 방향으로 기울어 지거나 (오른쪽 또는 왼쪽) 또는 대각선에서는 볼이 정상 속도로 움직입니다.

내 계산의 결함은 어디에 있습니까?

제발 도와주세요, 나는 결과에서 멀지는 않지만이 문제를 해결해야합니다!

onTouch 방법 :

public boolean onTouchEvent(MotionEvent event) { 
    switch(event.getAction()) { 
     case(MotionEvent.ACTION_DOWN): 
      balle.setX(event.getX()); 
      balle.setY(event.getY()); 
      ya = event.getY(); 
      xa = event.getX(); 
      break; 

     case(MotionEvent.ACTION_UP): 
      xb = event.getX(); 
      yb = event.getY(); 
      balle.setMove(true); 
      break; 
    } 

    return true; 
} 

이 내 moveDirection 방법 :

public void moveDirection(float xa, float ya, float xb, float yb) { 
    if(!move) { 
     return; 
    } 
    else { 
     float m, b; 
     float dx = xb-xa; 

     m = (yb - ya)/(xb - xa); 

     b = ya - (m * xa); 

     if(dx > 0) { 
      this.x += speedX; 
     } 
     else { 
      this.x += -speedX; 
     } 

     this.y = (m * this.x + b); 
    } 
} 

사전에 감사합니다!

+0

오른쪽 또는 왼쪽으로 이동하면 해당 이벤트가 전달되지 않으므로 속도가 느려질 수있는 일부 상호 작용이 손실 될 수 있습니다.이 경우 기본 옵션을 추가해보십시오. 더 도움이되지 않아서 미안하지만 안드로이드에서 게임에 대해 거의 알지 못한다 :) –

+0

어디에 오른쪽 또는 왼쪽 옵션을 추가해야합니까? moveDirection 함수 또는 onTouch 함수에서? –

+0

onTouch의 경우 기본 동작 옵션을 추가하면 다른 터치 이벤트를 캡처 할 수 있습니다. VelocityTracker를 추가하여 이벤트의 속도를 결정할 수 있습니다. 예를 들어 코드를 게시합니다. –

답변

0

나는 모든 이벤트를 캡처하지 않으므로, VelocityTracker API가 포함 된 Android 문서의 코드가 도움이 될 수 있습니다.이 예에서는 손가락을 떼었을 때 새로운 추적기가 만들어지고 이동할 때 어떤 방향으로) 이벤트의 속도를 캡처, 나는 당신이 속도와 터치의 방향에 따라 공을 이동할 수 있다고 생각합니다.

public class MainActivity extends Activity { 
private static final String DEBUG_TAG = "Velocity"; 
    ... 
private VelocityTracker mVelocityTracker = null; 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    int index = event.getActionIndex(); 
    int action = event.getActionMasked(); 
    int pointerId = event.getPointerId(index); 

    switch(action) { 
     case MotionEvent.ACTION_DOWN: 
      if(mVelocityTracker == null) { 
       // Retrieve a new VelocityTracker object to watch the velocity of a motion. 
       mVelocityTracker = VelocityTracker.obtain(); 
      } 
      else { 
       // Reset the velocity tracker back to its initial state. 
       mVelocityTracker.clear(); 
      } 
      // Add a user's movement to the tracker. 
      mVelocityTracker.addMovement(event); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      mVelocityTracker.addMovement(event); 
      // When you want to determine the velocity, call 
      // computeCurrentVelocity(). Then call getXVelocity() 
      // and getYVelocity() to retrieve the velocity for each pointer ID. 
      mVelocityTracker.computeCurrentVelocity(1000); 
      // Log velocity of pixels per second 
      // Best practice to use VelocityTrackerCompat where possible. 
      Log.d("", "X velocity: " + 
        VelocityTrackerCompat.getXVelocity(mVelocityTracker, 
        pointerId)); 
      Log.d("", "Y velocity: " + 
        VelocityTrackerCompat.getYVelocity(mVelocityTracker, 
        pointerId)); 
      break; 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_CANCEL: 
      // Return a VelocityTracker object back to be re-used by others. 
      mVelocityTracker.recycle(); 
      break; 
    } 
    return true; 
} 
} 

doc에 대한 링크.