2016-06-18 6 views
2

Я пытаюсь разработать простую игру, в которой мне нужно бросить пулю. Я хотел бы, чтобы мяч следовал за прикосновением или проведите пальцем по направлению.Java Android onTouch Direction

Однако у меня есть небольшая проблема, что у меня не было успеха в решении.

Я беру координаты на ACTION_DOWN из MotionEvent и координаты на ACTION_UP из MotionEvent, то вычислить уравнение прямой линии, чтобы переместить мяч в соответствии с этой прямой.

Проблема заключается в том, что когда я пробираюсь в направлении, близком к «вверх» или «вперед» или «впереди», мяч перемещается со скоростью молнии, а в другом направлении более искаженный (правый или левый) или диагональ, шар движется с нормальной скоростью.

Куда декомпрессия в моих расчетах?

Помогите мне, пожалуйста, я не за горами, но вам нужно решить эту проблему!

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

Когда вы двигаетесь вправо или влево, ни одно из этих событий не отправляется, поэтому, возможно, вы теряете некоторые взаимодействия (что может привести к более низкой скорости), попробуйте добавить параметр по умолчанию в этом случае, извините за не помощь больше, но я очень мало знаю об играх в android :) –

+0

Где я должен добавить опцию вправо или влево? В функции moveDirection или в функции onTouch? –

+0

в onTouch, вы захватываете только движение вниз и вверх, если вы добавите опцию по умолчанию в вашем случае, вы можете захватывать другие события касания. Вы можете добавить VelocityTracker для определения скорости события, я отправлю код с примером –

ответ

0

Я вижу, что вы не фиксируете все события, поэтому, возможно, код из документации для Android с помощью программы VelocityTracker api может помочь в этом примере, когда вы потяните палец, создается новый трекер и когда вы перемещаетесь (в в любом направлении) вы фиксируете скорость события, я думаю, вы можете перемещать мяч в соответствии со скоростью и направлением касания.

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.