0

2つのジョイスティック(1つは移動用、もう1つは射撃用)を備えたクイックシステムを作成しました。これらはマルチタッチで動作します。

ただし、両方を同時に使用すると、互いに干渉し(速度が低下したり、奇妙に曲がったりするなど)、これが私の電話(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