ส่งคืนรหัส multiTouch ที่ถูกต้อง


9

ฉันใช้เวลานับไม่ถ้วนในการอ่านบทเรียนและดูคำถามทุกข้อที่เกี่ยวข้องกับมัลติทัชจากที่นี่และ 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การเปลี่ยนแปลงสำหรับทั้งลายนิ้วมือครั้งแรกและครั้งที่สองของฉัน ฉันผูกมันไว้กับกล่อง แต่ตราบใดที่ฉันถือหนึ่งนิ้วในกล่องนี้มันจะเปลี่ยนค่าตามที่นิ้วมือที่สองของฉันแตะ มันเคลื่อนที่ไปในทิศทางที่ถูกต้องและไม่มีอะไรผิดพลาดปัญหาคือการเปลี่ยนแปลงความเร็วมันเกือบจะเหมือนกับการเพิ่มจุดสัมผัสทั้งสอง

คำตอบ:


4

ฉันคิดว่านี่จะได้ผลสำหรับคุณ

ความผิดพลาดอย่างหนึ่งที่คุณทำคือวนซ้ำตัวชี้ทั้งหมดสำหรับทุกเหตุการณ์ จำเป็นสำหรับการย้ายกิจกรรมเท่านั้น

ประการที่สองคุณต้องใส่ค่าดัชนีลงในฟังก์ชั่น getX และ getY แต่คุณได้รับ ID ที่เกี่ยวข้องกับดัชนีนั้นเพื่อใช้เป็นข้อมูลอ้างอิงสำหรับวัตถุเกมของคุณ คุณกำหนดรหัสให้กับจอยสติกของคุณในช่วงกิจกรรมลงและจากนั้นเมื่อทำการวนซ้ำดัชนีชี้วัดของคุณให้ตรวจสอบว่าดัชนีนั้นเชื่อมโยงกับรหัสตัวชี้ที่คุณกำหนดให้จอยสติกในระหว่างกิจกรรมลงหรือไม่ ถ้าเป็นเช่นนั้นให้ตรวจสอบว่ามันยังอยู่ในขอบเขตและอัพเดตหรือปิดใช้งาน

ฉันไม่ได้ทดสอบรหัสนี้ แต่ฉันรู้ว่ามันใช้งานได้ในแนวคิดเพราะฉันใช้วิธีการในรหัสของตัวเอง แจ้งให้เราทราบหากมีปัญหาใด ๆ กับมันที่คุณไม่สามารถคิดออก

ก่อนอื่นคุณจะต้องเพิ่มสิ่งต่อไปนี้ในคลาสจอยสติกของคุณ

boolean dragging=false;
int draggingId;
boolean shooting=false;
int shootingId;

เปลี่ยน onTouchEvent ของคุณเป็นสิ่งนี้

public boolean onTouchEvent(MotionEvent event) {


    int index = event.getActionIndex();
    int id = event.getPointerId(index);
    String actionString;

    switch (event.getActionMasked()) {
        case MotionEvent.ACTION_DOWN:
            try{
                    if(x > 0 && x < steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()
                        && !joystick.dragging) {
                            movingPoint.x = x;
                            movingPoint.y = y;
                            joystick.dragging = true;
                            joystick.draggingId = id;
                    }
                    else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()
                        && !joystick.shooting) { 
                            shootingPoint.x = x;
                            shootingPoint.y = y;
                            joystick.shooting=true;
                            joystick.shootingId=id;
                    }
              }
              catch(Exception e){

              }

            actionString = "DOWN";
            break;
        case MotionEvent.ACTION_UP:
            if(id == draggingID)
                joystick.dragging = false;
            if(id ==  shootingID)
                joystick.shooting = false;
            actionString = "UP";
            break;  
        case MotionEvent.ACTION_POINTER_DOWN:
            try{
                    if(x > 0 && x < steeringxMesh + joystick.get_joystickBg().getWidth() * 2)
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()
                        && !joystick.dragging) {
                            movingPoint.x = x;
                            movingPoint.y = y;
                            joystick.dragging = true;
                            joystick.draggingId = id;
                    }
                    else if(x > shootingxMesh - (joystick.get_joystickBg().getWidth()) && x < panel.getWidth()
                        && y > yMesh - (joystick.get_joystickBg().getHeight()) && y < panel.getHeight()
                        && !joystick.shooting) { 
                            shootingPoint.x = x;
                            shootingPoint.y = y;
                            joystick.shooting=true;
                            joystick.shootingId=id;
                    }
              }
              catch(Exception e){

              }

            actionString = "PNTR DOWN";
            break;
        case MotionEvent.ACTION_POINTER_UP:
            if(id == joystick.draggingID)
                joystick.dragging = false;
            if(id ==  joystick.shootingID)
                joystick.shooting = false;
            actionString = "PNTR UP";
            break;
        case MotionEvent.ACTION_CANCEL:
            if(id == joystick.draggingID)
                joystick.dragging = false;
            if(id ==  joystick.shootingID)
                joystick.shooting = false;
            actionString = "CANCEL";
            break;
        case MotionEvent.ACTION_MOVE:
            for(index=0; index<e.getPointerCount(); index++) {
                id=e.getPointerId(index);
                int x = (int) event.getX(index);
                int y = (int) event.getY(index); 
                if(joystick.dragging && id == joystick.draggingId) {
                    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;
                    }
                    else
                        dragging = false;
                    }
                }
                else if(joystick.shooting && id == joystick.shootingId){
                    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;                            
                    }
                    else
                        shooting = false;
                    }
                }
            }
            actionString = "MOVE";
            break;
        }
    }

คุณเป็นฮีโร่ของฉัน ฉันจะเพิ่มรหัสที่อัปเดตลงในคำถามของฉันเพื่อให้คุณสามารถดูว่าฉันแก้ไขด้วยความช่วยเหลือของคุณ! ตอนนี้ฉันก็สามารถเล่นจนจบเกม: D
Green_qaue

7

คุณเกือบจะทำให้ถูกต้อง แต่คุณควรใช้รหัสตัวชี้ของคุณเพื่อขอ X / Y แทน i

    int id = event.getPointerId(i);
    int x = (int) event.getX(id);
    int y = (int) event.getY(id);

จากเอกสาร MotionEvent:

ลำดับของพอยน์เตอร์ที่ปรากฏภายในเหตุการณ์การเคลื่อนไหวไม่ได้ถูกกำหนด ดังนั้นดัชนีตัวชี้ของตัวชี้สามารถเปลี่ยนจากเหตุการณ์หนึ่งไปยังอีกเหตุการณ์หนึ่ง แต่รหัสตัวชี้ของตัวชี้ถูกรับประกันว่าจะคงที่ตราบใดที่ตัวชี้ยังคงทำงานอยู่ ใช้เมธอด getPointerId (int) เพื่อรับ id ตัวชี้ของตัวชี้เพื่อติดตามเหตุการณ์การเคลื่อนไหวที่ตามมาทั้งหมดในท่าทาง จากนั้นสำหรับกิจกรรมการเคลื่อนไหวต่อเนื่องให้ใช้วิธี findPointerIndex (int) เพื่อรับดัชนีตัวชี้สำหรับรหัสตัวชี้ที่กำหนดในเหตุการณ์การเคลื่อนไหวนั้น

event.getX/Yต้องการรหัสตัวชี้ไม่ใช่iเพราะไม่มีการรับประกันว่าจะอยู่ในลำดับเดียวกัน

นอกจากนี้ยังมีปัญหาที่ละเอียดอ่อน แต่สำคัญอีกปัญหาหนึ่ง โปรดสังเกตว่าตระกูลฟังก์ชัน getAction () ไม่รับพารามิเตอร์ มันแปลกดีใช่มั้ย การรับ X / Y จำเป็นต้องมีรหัสตัวชี้ แต่ไม่ต้องดำเนินการเลย? นั่นคือการพูดถึงสิ่งสำคัญสองสามอย่าง:

  • คุณได้รับการโทรถึงคุณแตะตัวจัดการสำหรับแต่ละการกระทำของตัวชี้แต่ละตัวและไม่ใช่การโทรหนึ่งครั้งต่อหนึ่งเฟรมสำหรับตัวชี้ทั้งหมด
  • getX / Y ดูร่องรอยของตัวชี้จนถึงและส่งคืนค่าล่าสุดในขณะที่ getAction สอบถามเกี่ยวกับเหตุการณ์ปัจจุบันเท่านั้น

ดังนั้นหมายความว่าคุณจะได้รับหนึ่งในการเรียกร้องให้ดำเนินการสัมผัสของคุณต่อการกระทำของตัวชี้ (ลง / ย้าย / ขึ้นไป) ดังนั้นสองนิ้วเคลื่อนที่ = 2 สาย ผลข้างเคียงที่น่ารังเกียจของรหัสของคุณคือมันใช้การกระทำของเหตุการณ์เดียวกับตัวชี้ทั้งหมด ...

ดังนั้นแทนที่จะวนซ้ำร่องรอยเพียงรับ pid / x / y / การกระทำสำหรับเหตุการณ์ปัจจุบันเท่านั้น (สำหรับการเคลื่อนไหวพร้อมกันคุณจะได้รับสายอีกครั้งเพื่อจัดการของคุณในภายหลังอย่างที่ฉันพูด)

นี่คือรหัสของฉันเพื่อจัดการเหตุการณ์:

 public static boolean sendTouchToGameEngine (MotionEvent event)
 {
  int action = event.getAction();
  int actionCode = action & MotionEvent.ACTION_MASK;
  int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;

  [...]
  sendTouchToGameEngine(pid, actionCode, (int)event.getX(pid), (int)event.getY(pid));
  [...]

  return true;

}

ในการกลับไปที่รหัสของคุณคุณควรจะทำให้มันง่ายขึ้นด้วยวิธีต่อไปนี้ ลูปหายไปมิฉะนั้นหากคุณมีข้อห้ามอื่น ๆ ที่คุณไม่ได้กล่าวถึงคุณสามารถเพิ่มกลับได้ตลอดเวลา มันทำงานได้โดยการติดตามว่าตัวชี้รหัสใดที่ใช้สำหรับการควบคุม (ย้าย / ยิง) เมื่อมีการทริกเกอร์ DOWN และทำการรีเซ็ตบน UP เนื่องจากคุณไม่ได้ใช้รูปแบบลายเส้นคุณสามารถ จำกัด สวิตช์ของคุณ () เป็นลง, ขึ้น, ย้ายและนอก

int movePointerId = -1;
int shootingPointerId = -1;

void TouchEventHandler(MotionEvent event) {   
    // grab the pointer id 
    int pid = action >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
    int x = (int) event.getX(pid);
    int y = (int) event.getY(pid); 
    int action = event.getAction();
    int actionCode = action & MotionEvent.ACTION_MASK;
    int actionIndex = event.getActionIndex();
    String actionString;


    switch (actionCode)
    {
        case MotionEvent.ACTION_DOWN:
        // on DOWN, figure out whether the player used the moving or shooting control, if any.
        // if so, kept track of which pointer was used, because all following call about that
        // finger touches will use the same pointer id. Also record the current point coordinates.
            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;
                        movePointerId = pid;
                    }
                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;
                        shootingPointerId = pid;
                    }
                }catch(Exception e){

                }
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_OUTSIDE:
        // whether the player lift the finger or moves it out of bounds
        // figure out which pointer that was and reset it. You can add additional
        // processing here as required
           if( pid == movePointerId )
              movePointerId = -1;
           else if( pid == shootingPointerId )
              shootingPointerId = -1;
            actionString = "UP";
            break;  
        case MotionEvent.ACTION_MOVE:
        // when the player move their finger, it is simply a matter of comparing the pid
        // to know which one it is
          if( pid == movePointerId ) {
                        movingPoint.x = x;
                        movingPoint.y = y;
          } else if( pid == shootingPointerId ) {
                        shootingPoint.x = x;
                        shootingPoint.y = y;
          }
                actionString = "MOVE";

    }
}

ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้ล้างสองสิ่งขึ้นจริง ๆ คุณช่วยอธิบายว่าบรรทัดนี้sendTouchToGameEngine(pid, actionCode, (int)event.getX(pid), (int)event.getY(pid));ทำอะไรและเมื่อคุณเรียกมันว่าอะไร?
Green_qaue

เมื่อฉันใช้สายนี้: int pid = action >> MotionEvent.ACTION_POINTER_ID_SHIFT;eclipse บอกให้ฉันเพิ่ม supressWarning เป็นปกติหรือไม่ ขออภัยสำหรับคำถามทั้งหมดหลังจากคำตอบอย่างละเอียด MotionEvent ใหม่มากสำหรับฉันและไม่สามารถเข้าใจตรรกะด้วยเหตุผลบางอย่าง
Green_qaue

เพิ่มโค้ดการปรับปรุงที่คุณสามารถดู I dont ทราบจริงๆสิ่งที่จะทำอย่างไรกับและวงยังคงมีเคยชินทำงานโดยไม่ได้เพราะผมต้องการที่จะได้รับpid i
Green_qaue

@Max: sendTouchToGameEngine เป็นเพียงการโทรเพื่อเพิ่มกิจกรรมนี้ในคิวเอ็นจิ้นเกมของฉันที่ต้องดำเนินการในระหว่างการอัพเดตครั้งต่อไป หากคุณไม่ได้ใช้คิวในการหยั่งเสียงเหตุการณ์การป้อนข้อมูลของคุณคุณเสี่ยงต่อการเรียกฟังก์ชั่นของคุณที่ยุ่งกับสถานะของเอ็นจิ้นเกมในรูปแบบที่ไม่คาดคิดเนื่องจาก TouchEvent มาจากเธรด UI และสันนิษฐานว่า ทำงานในเธรดอื่น
ADB

@ Max: ฉันไม่รู้เกี่ยวกับคำเตือนอย่างน่าเสียดาย คุณบอกเราได้ไหมว่ามันคืออันไหน?
ADB

0

มีความประหลาดเล็กน้อยเกิดขึ้นกับรหัสนี้ ฉันไม่ได้ใช้ Android ดังนั้นบางทีฉันคิดว่านี่เป็นสิ่งที่ไม่ใช่ อย่างไรก็ตามฉันสังเกตเห็นว่าคุณได้ตำแหน่งมาสองครั้งด้วยสองวิธีที่แตกต่างกัน:

ก่อนอื่นคุณจะได้รับสิ่งนี้เมื่อเริ่มpointerCountห่วง

(int) event.getX(i)

จากนั้นในคำสั่ง switch ของคุณคุณจะได้รับดังนี้

(int) event.getX(id)

ขอให้สังเกตว่าคุณเปลี่ยนจากการใช้กับการใช้iid

ฉันสมมติว่ามันควรจะเป็นวิธีการเดิม ฉันขอแนะนำให้แทนที่อินสแตนซ์ทั้งหมดของ(int) event.getX(id)และใช้ค่าที่xคุณตั้งไว้ที่จุดเริ่มต้น ในทำนองเดียวกันการแลกเปลี่ยนการ(int) event.getY(id)y

ลองเปลี่ยนส่วนเหล่านี้:

int pointerCount = event.getPointerCount(); 
for (int i = 0; i < pointerCount; i++)
{       
    int x = (int) event.getX(i);
    int y = (int) event.getY(i);

จากนั้นภายในสวิตช์ของคุณใช้สิ่งนี้:

    try{
        if(x > 0 && x < touchingBox &&
              y > touchingBox && y < view.getHeight()){
            movingPoint.x = x;
            movingPoint.y = y;
            dragging = true;
        }
        else if(x > touchingBox && x < view.getWidth() &&
                   y > touchingBox && y < view.getHeight()){
            shootingPoint.x = x;
            shootingPoint.y = y;
            shooting=true;
        }else{
            shooting=false;
            dragging=false;
        }

2
สนใจที่จะแสดงความคิดเห็นว่าทำไมสิ่งนี้จึงไม่มีประโยชน์และควรค่าแก่การลงคะแนนเสียง? มันเป็นสิ่งที่ต้องทำอย่างสุภาพ
MichaelHouse

เห็นด้วยถ้าคุณลงคะแนน บอกให้เขารู้ว่าทำไม คุณถูกต้องจากวิธีเดิม ฉันพยายามทำสิ่งที่แตกต่างกันออกไปเป็นล้านดังนั้นฉันแค่ลืมที่จะลบมัน
Green_qaue

คุณสามารถอัปเดตรหัสในคำถามเพื่อสะท้อนได้หรือไม่ ฉันเห็นคุณลบการตั้งค่าxและyแต่คุณยังคงได้รับตำแหน่งในidภายหลัง
MichaelHouse

ใช่ฉันใช้เวลาสักครู่เพื่อทำความเข้าใจคำตอบของคุณ แต่มันจะทำงานอย่างไร ถ้าฉันใช้ตัวแปรเดียวกัน ( x=event.getX(i)) แล้วxจะต้องเก็บค่า 2 เมื่อใดก็ตามที่pointerCountมากกว่า 1 ถูกต้อง? และนั่นไม่ใช่ความรู้สึกที่ถูกต้อง
Green_qaue

1
จากสิ่งที่ฉันเข้าใจeventจริงๆเป็นรายการเหตุการณ์ คุณเข้าถึงกิจกรรมที่แตกต่างกันโดยไปที่รายการเช่นที่คุณทำ ดังนั้นในการเข้าถึงxตำแหน่งสำหรับเหตุการณ์ที่สองที่คุณใช้event.getX(1)(เนื่องจากเราเริ่มต้นที่ 0) มีหลายตัวxคุณกำลังใช้พารามิเตอร์เพื่อบอกสิ่งที่คุณต้องการ คุณวนเหตุการณ์ทั้งหมดด้วยforลูปดังนั้นใช้หมายเลขนั้นเป็นเหตุการณ์ปัจจุบันที่คุณสนใจดูคำแนะนำการเปลี่ยนรหัสของฉัน
MichaelHouse

0

ฉันมีปัญหาที่คล้ายกันหนึ่งครั้งใน Huawei U8150 มัลติทัชสองนิ้วบนอุปกรณ์นั้นแย่มากใช้แอพทดสอบมัลติทัช (อาจเป็น "เครื่องทดสอบโทรศัพท์" แต่ฉันไม่แน่ใจ) ฉันสามารถเห็นว่าการสัมผัสด้วยนิ้วที่สองนั้นย้ายจุดสัมผัสแรกของพิกเซลจำนวนมาก . หากนั่นเป็นปัญหาของคุณมากกว่าที่เกี่ยวข้องกับฮาร์ดแวร์และฉันไม่คิดว่าคุณจะทำอะไรได้มากไปกว่า :(

ขอโทษสำหรับภาษาอังกฤษที่ไม่ดีของฉัน


นั่นไม่ใช่ปัญหา
Green_qaue

ตกลงเป็นเพียงความคิด
มาร์ตินมาร์ติเน

0

ฉันเชื่อว่าปัญหาของคุณคือคุณกำลังสมมติว่าระหว่างการปรับปรุงลำดับที่ตัวชี้ถูกจัดเรียงยังคงเหมือนเดิม ไม่น่าจะเป็นอย่างนั้น

ลองนึกภาพสถานการณ์ที่คุณสัมผัสด้วยนิ้ว A จะมี pointerCount () เท่ากับ 1 และ A จะเป็นองค์ประกอบเดียวที่คุณสามารถถามได้ หากคุณเพิ่มนิ้วที่สอง pointerCount () จะเป็น 2, A จะอยู่ที่ดัชนี 0, B จะอยู่ที่ดัชนี 1 หากคุณยกนิ้ว A, pointerCount () จะเป็น 1 อีกครั้งและB จะอยู่ที่ดัชนี 0 . จากนั้นถ้าคุณสัมผัสด้วยนิ้วอีกครั้งจะได้รับการที่ดัชนีที่ 1 และ B จะเป็นที่ดัชนี 0

นี่คือเหตุผลที่ระบุตัวชี้ ID เพื่อให้คุณสามารถติดตามแต่ละการสัมผัสระหว่างการอัพเดต ดังนั้นหากการสัมผัสครั้งแรกของนิ้ว B ถูกกำหนด ID 12 มันจะมี ID นั้นเสมอแม้ว่าจะเอานิ้ว A ออกแล้วเพิ่มใหม่ก็ตาม

ดังนั้นหากรหัสของคุณระบุการสัมผัสใกล้กับจอยสติ๊กของคุณจะต้องตรวจสอบเพื่อดูว่ามีความคืบหน้าในการ 'ยิง' อยู่หรือไม่ หากไม่เป็นเช่นนั้น ID ของการถ่ายภาพควรถูกจดจำในตัวแปรสมาชิกบางตัวที่ยังคงมีอยู่ในการอัปเดตครั้งต่อไป ในการอัปเดตครั้งต่อไปหากคุณมีความคืบหน้าในการ 'ถ่ายภาพ' ให้ทำซ้ำผ่านตัวชี้แล้วมองหาตัวชี้ที่มี ID ที่ถูกต้องและเป็นตัวชี้ที่คุณต้องใช้เพื่อติดตามการอัปเดต เช่นเดียวกับการสัมผัสการเคลื่อนไหว เมื่อปล่อยสัมผัสคุณล้าง ID ที่เกี่ยวข้องกับจอยสติกนั้นเพื่อให้การสัมผัสใหม่สามารถควบคุมได้

แม้ว่าการสัมผัสที่เริ่มต้นใกล้กับจอยสติกหนึ่งอยู่ห่างจากตำแหน่งสัมผัสเดิมโดยใช้ ID คุณสามารถระบุจอยสติ๊กที่ควบคุมได้ และเป็นผลข้างเคียงที่ดีนิ้วจรจัดที่สองใกล้กับจอยสติ๊กเฉพาะจะไม่มีผลกระทบใด ๆ เพราะจอยสติกจะถูกผูกไว้กับนิ้วแรกที่ทริกเกอร์จนกระทั่งมันปล่อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.