游戏控制器的Android多点触摸问题

游戏控制器的Android多点触摸问题,android,touch,touch-event,motionevent,Android,Touch,Touch Event,Motionevent,我正在写一个应用程序,屏幕上有两个软d-Pad。我在尝试捕捉和理解两次同时触摸的所有触摸事件时遇到了极大的困难,因为每个动作事件都表示id等于0 我有两个“触碰”物体,当有触碰时,它们通过管道进入碰撞检测系统。记住,我有两个d-PAD,两个都需要同时控制 有人有什么建议吗。这是我的onTouchEvent方法。请记住,可能很难理解上下文,因为我使用cusomt“touch”游戏对象与d-Pad进行碰撞检测 @Override public void onTouchEvent(MotionEven

我正在写一个应用程序,屏幕上有两个软d-Pad。我在尝试捕捉和理解两次同时触摸的所有触摸事件时遇到了极大的困难,因为每个动作事件都表示id等于0

我有两个“触碰”物体,当有触碰时,它们通过管道进入碰撞检测系统。记住,我有两个d-PAD,两个都需要同时控制

有人有什么建议吗。这是我的onTouchEvent方法。请记住,可能很难理解上下文,因为我使用cusomt“touch”游戏对象与d-Pad进行碰撞检测

@Override
public void onTouchEvent(MotionEvent e)
{   
    int index = e.getActionIndex();


    int action = MotionEventCompat.getActionMasked(e);
    // Get the index of the pointer associated with the action.
    //index = MotionEventCompat.getActionIndex(e);

    int id = e.getPointerId(index);


    if(touch1.pointerID<0)
        touch1.pointerID = id;
    else
        touch2.pointerID = id;

    switch(action)
    {
        case MotionEvent.ACTION_DOWN:
        {
            if(id == touch1.pointerID)
            {
                touch1.setCollideable(true);
                touch1.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
                touch1.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
            }
            else if(id==touch2.pointerID)
            {
                touch2.setCollideable(true);
                touch2.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
                touch2.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();

            }

            break;  
        }
        case MotionEvent.ACTION_POINTER_DOWN:
        {
            if(id == touch1.pointerID)
            {
                touch1.setCollideable(true);
                touch1.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
                touch1.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
            }
            else if(id==touch2.pointerID)
            {
                touch2.setCollideable(true);
                touch2.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
                touch2.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();

            }
            break;
        }
        case MotionEvent.ACTION_UP:
        {
            if(id == touch1.pointerID)
            {
                touch1.setCollideable(false);
                touch1.pointerID = -1;
                touch1.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
                touch1.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
            }
            else if(id==touch2.pointerID)
            {
                touch2.setCollideable(false);
                touch2.pointerID = -1;
                touch2.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
                touch2.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();

            }
            break;
        }
        case MotionEvent.ACTION_POINTER_UP:
        {
            if(id == touch1.pointerID)
            {
                touch1.setCollideable(false);
                touch1.pointerID = -1;
                touch1.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
                touch1.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();
            }
            else if(id==touch2.pointerID)
            {
                touch2.setCollideable(false);
                touch2.pointerID = -1;
                touch2.getPosition().x = e.getX(index)*GameWorldProperties.getWidthRatio();
                touch2.getPosition().y = e.getY(index)*GameWorldProperties.getHeightRatio();

            }
            break;
        }
        case MotionEvent.ACTION_MOVE:
        {
                Log.d("pointer",String.format("Move index=%s id=%s", index,id));

                for(int i=0;i<e.getPointerCount();i++)
                {
                    Log.d("pointer",String.format("i=%s id=%s",i,e.getPointerId(i)));

                    touch1.setCollideable(true);
                    touch1.getPosition().x = e.getX(i)*GameWorldProperties.getWidthRatio();
                    touch1.getPosition().y = e.getY(i)*GameWorldProperties.getHeightRatio();

                    touch2.setCollideable(true);
                    touch2.getPosition().x = e.getX(i)*GameWorldProperties.getWidthRatio();
                    touch2.getPosition().y = e.getY(i)*GameWorldProperties.getHeightRatio();
                }

            break;
        }
        default:
        {
            break;
        }
    }
@覆盖
公共事件(运动事件e)
{   
int index=e.getActionIndex();
int action=MotionEventCompat.getActionMasked(e);
//获取与操作关联的指针的索引。
//index=MotionEventCompat.getActionIndex(e);
int id=e.getPointerId(索引);

if(touch1.pointerID希望这有帮助。这是从Android游戏编程书开始的

public boolean onTouch(View v, MotionEvent event) {
    synchronized (this) {
        int action = event.getAction() & MotionEvent.ACTION_MASK;
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
        int pointerId = event.getPointerId(pointerIndex);
        TouchEvent touchEvent;

        switch (action) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
            touchEvent = touchEventPool.newObject();
            touchEvent.type = TouchEvent.TOUCH_DOWN;
            touchEvent.pointer = pointerId;
            touchEvent.x = touchX[pointerId] = (int) (event
                    .getX(pointerIndex) * scaleX);
            touchEvent.y = touchY[pointerId] = (int) (event
                    .getY(pointerIndex) * scaleY);
            isTouched[pointerId] = true;
            touchEventsBuffer.add(touchEvent);
            break;

        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:
            touchEvent = touchEventPool.newObject();
            touchEvent.type = TouchEvent.TOUCH_UP;
            touchEvent.pointer = pointerId;
            touchEvent.x = touchX[pointerId] = (int) (event
                    .getX(pointerIndex) * scaleX);
            touchEvent.y = touchY[pointerId] = (int) (event
                    .getY(pointerIndex) * scaleY);
            isTouched[pointerId] = false;
            touchEventsBuffer.add(touchEvent);
            break;

        case MotionEvent.ACTION_MOVE:
            int pointerCount = event.getPointerCount();
            for (int i = 0; i < pointerCount; i++) {
                pointerIndex = i;
                pointerId = event.getPointerId(pointerIndex);

                touchEvent = touchEventPool.newObject();
                touchEvent.type = TouchEvent.TOUCH_DRAGGED;
                touchEvent.pointer = pointerId;
                touchEvent.x = touchX[pointerId] = (int) (event
                        .getX(pointerIndex) * scaleX);
                touchEvent.y = touchY[pointerId] = (int) (event
                        .getY(pointerIndex) * scaleY);
                touchEventsBuffer.add(touchEvent);
            }
            break;
        }

        return true;
    }
}
public boolean onTouch(视图v,运动事件){
已同步(此){
int action=event.getAction()&MotionEvent.action\u掩码;
int pointerIndex=(event.getAction()&MotionEvent.ACTION\u POINTER\u ID\u MASK)>>MotionEvent.ACTION\u POINTER\u ID\u SHIFT;
int pointerId=event.getPointerId(pointerIndex);
触摸事件触摸事件;
开关(动作){
case MotionEvent.ACTION\u DOWN:
case MotionEvent.ACTION\u指针\u向下:
touchEvent=touchEventPool.newObject();
touchEvent.type=touchEvent.TOUCH\u DOWN;
touchEvent.pointer=指针ID;
touchEvent.x=touchX[pointerId]=(int)(事件
.getX(指针索引)*scaleX;
touchEvent.y=touchY[pointerId]=(int)(事件
.getY(pointerIndex)*scaleY;
isTouched[pointerId]=真;
touchEventsBuffer.add(touchEvent);
打破
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:
case MotionEvent.ACTION\u取消:
touchEvent=touchEventPool.newObject();
touchEvent.type=touchEvent.TOUCH\u;
touchEvent.pointer=指针ID;
touchEvent.x=touchX[pointerId]=(int)(事件
.getX(指针索引)*scaleX;
touchEvent.y=touchY[pointerId]=(int)(事件
.getY(pointerIndex)*scaleY;
isTouched[pointerId]=false;
touchEventsBuffer.add(touchEvent);
打破
case MotionEvent.ACTION\u移动:
int pointerCount=event.getPointerCount();
for(int i=0;i
事实上,这真的很有帮助!这告诉我,与其维护对触摸对象的引用,不如在每个动作中生成一个新的引用!这很有意义!谢谢!不客气。我真的推荐这本书。我从中学到了很多。