2016-06-18 3 views
2

私は弾を投げる必要があるシンプルなゲームを開発しようとしています。 私はボールがタッチまたはスワイプの方向に従いたいと思います。Java Android onTouch Direction

しかし、私は解決に成功しなかったという小さな問題があります。

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へのリンク。