0

我刚刚制作了一个快速系统,它有两个操纵杆(一个用于移动,一个用于射击),它们可以与多点触控配合使用。

但是,当您同时使用两者时,它们会相互干扰(您放慢速度、奇怪地转弯等),我想知道这是我的手机(Nexus One,2.3.6)的问题还是代码的问题:

public void handleEvent(MotionEvent event) {
    final int action = event.getAction();
    switch(action & MotionEvent.ACTION_MASK){
        case MotionEvent.ACTION_DOWN: {
            pointerID = event.getPointerId(0);
            int tx = (int) event.getX(event.findPointerIndex(pointerID));
            int ty = (int) event.getY(event.findPointerIndex(pointerID));
            boolean reset = true;
            if(tx >= (x - radius * 2) && (tx <= (x + radius * 2))) {
                if(ty >= (y - radius * 2) && (ty <= (y + radius * 2))) {
                    dx = (tx - x);
                    dy = (ty - y);
                    reset = false;
                }
            }
            if(reset) pointerID = -1;
            break;
        }
        case MotionEvent.ACTION_POINTER_DOWN: {
            if(pointerID == -1) {
                final int pointerIndex = event.getActionIndex();
                pointerID = event.getPointerId(pointerIndex);
                int tx = (int) event.getX(pointerIndex);
                int ty = (int) event.getY(pointerIndex);
                if(tx >= (x - radius * 2) && (tx <= (x + radius * 2))) {
                    if(ty >= (y - radius * 2) && (ty <= (y + radius * 2))) {
                        dx = (tx - x);
                        dy = (ty - y);
                    }
                }
            }
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            if(pointerID != -1) {
                final int pointerIndex = event.findPointerIndex(pointerID);
                int tx = (int) event.getX(pointerIndex);
                int ty = (int) event.getY(pointerIndex);
                if(tx >= (x - radius * 2) && (tx <= (x + radius * 2))) {
                    if(ty >= (y - radius * 2) && (ty <= (y + radius * 2))) {
                        dx = (tx - x);
                        dy = (ty - y);
                    }
                }
            }
            break;
        }
        case MotionEvent.ACTION_POINTER_UP: {
            final int pointerIndex = event.getActionIndex();
            final int id = event.getPointerId(pointerIndex);
            if(id == pointerID) {
                dy = 0;
                dx = 0;
                pointerID = -1;
            }
            break;
        }
        case MotionEvent.ACTION_UP: {
            if(-1 != pointerID) {
                dy = 0;
                dx = 0;
                pointerID = -1;
            }
            break;
        }

    }
}

重要笔记:

每个操纵杆都是一个类,每个操纵杆都会调用handleEvent 方法。

pointerID是属于每个操纵杆的 int

dy并且dx只是到操纵杆中心的距离。

4

1 回答 1

0

您缺少的是,如果同时发生多个触摸,则一个 MotionEvent 包含所有触摸(如果其中一个触摸的类型为 ACTION_MOVE,它还包含该运动的历史记录)。

使用 event.getPointerCount() 上的循环(如果它>1)作为索引来获取每个接触点的 ID,然后您可以使用它来跟踪触摸并获取触摸的 x/y/其他信息。

现在要意识到的是,pointerID 不仅跟踪触摸......而且如果触摸点消失(以 ACTION_UP 事件结束),它也可以改变;POINTER_DOWN 事件将始终在最后添加带有 ID 的触摸(因此,如果您有两次触摸,它将获得 ID 2),但在 POINTER_UP(或 POINTER_2_UP,如果它是第二个触摸点)上,带有通过向下移动更高的 ID 更改 ID。

因此,如果您有 ID 0、1 和 2 的触摸,并且第二次触摸(ID 1)变为 POINTER_UP,您必须意识到 pointerID 2 将变为 ID 1。如果您有两次触摸(0 和 1),如果ID 0 上升,一下子 ID 1 变成了 ID 0!

诀窍是使用一些全局变量(leftJoyStickID 和 rightJoyStickID)以及 action_down 和 action_up 中的一些代码来跟踪这一点。只需两个接触点,三元运算符就是您的朋友:

如果(IDofActionUpEvent == leftJoyStickID){ rightJoyStickID = IDofActionUpEvent == 0 ?1:0;}

于 2013-11-12T02:43:22.567 回答