Java Android onTouch Direction



我正在尝试开发一个简单的游戏,其中我需要扔一个子弹。我希望球跟随触摸或滑动方向。

但是,我有一个小问题,我在解决方面没有成功。

我在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);
    }
}

预先感谢您!

我看到您没有捕获所有事件创建以及(在任何方向上移动)时,您捕获事件的速度,我认为您可以根据触摸的速度和方向移动球。

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的链接

最新更新