ฉันใช้เวลานับไม่ถ้วนในการอ่านบทเรียนและดูคำถามทุกข้อที่เกี่ยวข้องกับมัลติทัชจากที่นี่และ Stackoverflow แต่ฉันก็ไม่สามารถหาวิธีที่จะทำอย่างถูกต้อง ฉันใช้การวนซ้ำเพื่อรับของpointerIdฉันฉันไม่เห็นคนจำนวนมากทำเช่นนี้ แต่มันเป็นวิธีเดียวที่ฉันจัดการเพื่อให้มันทำงานได้ค่อนข้างดี
ฉันมีจอยสติ๊กสองอันบนหน้าจอหนึ่งอันสำหรับการเคลื่อนไหวและอีกอันหนึ่งสำหรับควบคุมการหมุนของสไปรท์และมุมที่เขายิงเช่นใน Monster Shooter ทั้งสองทำงานได้ดี
ปัญหาของฉันคือเมื่อฉันย้ายสไปรท์ของฉันในเวลาเดียวกันกับการถ่ายภาพ Im การtouchingPointเคลื่อนไหวของฉันถูกตั้งค่าไว้ที่การtouchingPointยิงของฉันเนื่องจากxและyสูงกว่าการtouchingPointยิงของฉัน ( moving-stickทางด้านซ้ายของหน้าจอshooting-stickทางด้านขวา) เทพดาของฉันเพิ่มความเร็วสิ่งนี้ทำให้เกิดการเปลี่ยนแปลงความเร็วที่ไม่พึงประสงค์สำหรับสไปรต์ของฉัน
นี่คือวิธีที่ฉันแก้ไขมันด้วยความช่วยเหลือของคุณ! นี่คือสำหรับทุกคนที่อาจพบปัญหาที่คล้ายกัน:
    public void update(MotionEvent event) {
    if (event == null && lastEvent == null) {
        return;
    } else if (event == null && lastEvent != null) {
        event = lastEvent;
    } else {
        lastEvent = event;
    }   
        int action = event.getAction();
        int actionCode = action & MotionEvent.ACTION_MASK;
        int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
        int x = (int) event.getX(pid);
        int y = (int) event.getY(pid); 
        int index = event.getActionIndex();
        int id = event.getPointerId(index);
        String actionString = null;
        switch (actionCode)
        {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_POINTER_DOWN:
                actionString = "DOWN";
                try{
                    if(x > 0 && x < steeringxMesh + (joystick.get_joystickBg().getWidth() * 2)
                            && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
                            movingPoint.x = x;
                            movingPoint.y = y;
                            dragging = true;
                            draggingId = id;
                        }
                    else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                            && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()){
                            shootingPoint.x = x;
                            shootingPoint.y = y;
                            shooting=true;
                            shootingId=id;
                        }
                    }catch(Exception e){
                    }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_OUTSIDE:            
                if(id == draggingId)
                    dragging = false;
                if(id ==  shootingId)
                    shooting = false;
                actionString = "UP";
                break;  
            case MotionEvent.ACTION_MOVE:           
                for(index=0; index<event.getPointerCount(); index++) {
                    id=event.getPointerId(index);
                    int xx = (int) event.getX(index); //pro naming of variable
                    int yy = (int) event.getY(index); 
                    if(dragging && id == draggingId) {
                        if(xx > 0 && xx < (steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
                            && yy > yMesh - (joystick.get_joystickBg().getHeight()) && yy < panel.getHeight()) {
                            movingPoint.x = xx;
                            movingPoint.y = yy;
                        }
                        else
                            dragging = false;
                        }
                    if(shooting && id == shootingId){
                        if(xx > shootingxMesh - (joystick.get_joystickBg().getWidth()) && xx < panel.getWidth()
                            && yy > yMesh - (joystick.get_joystickBg().getHeight()) && yy < panel.getHeight()) {
                            shootingPoint.x = xx;
                            shootingPoint.y = yy;                            
                        }
                        else
                            shooting = false;
                        }
                    }
                    actionString = "MOVE";
                    break;
        }
    Log.d(TAG, "actionsString: " + actionString + ", pid: " + pid + ", x: " + x + ", y: " + y);
จะไม่โพสต์รหัสมากถ้าฉันไม่ได้สูญเสียสิ่งที่ฉันทำผิด ฉันไม่สามารถเข้าใจการทำงานแบบมัลติทัชได้อย่างดี
โดยทั่วไปmovingPointการเปลี่ยนแปลงสำหรับทั้งลายนิ้วมือครั้งแรกและครั้งที่สองของฉัน ฉันผูกมันไว้กับกล่อง แต่ตราบใดที่ฉันถือหนึ่งนิ้วในกล่องนี้มันจะเปลี่ยนค่าตามที่นิ้วมือที่สองของฉันแตะ มันเคลื่อนที่ไปในทิศทางที่ถูกต้องและไม่มีอะไรผิดพลาดปัญหาคือการเปลี่ยนแปลงความเร็วมันเกือบจะเหมือนกับการเพิ่มจุดสัมผัสทั้งสอง