Implementación de Android Multitouch

Estoy tratando de implementar multitouch en mi juego, pero estoy teniendo problemas. Básicamente, todo lo que quiero es que el jugador corra, dispare o salte al mismo time. Seguí un tutorial multitáctil y lo integé en mi juego, pero todavía no estoy obteniendo el resultado deseado. Tengo una class de button que comtesting si un evento táctil está dentro de ciertos límites. En el código, el logging muestra que está funcionando bien y que se han detectado varios dedos para upload y bajar. Pero en lo que respecta a los botones, solo el primer button presionado se registra. Agradecería si alguien pudiera ayudarme a descubrir qué está mal / falta en el código:

@Override public boolean onTouch(MotionEvent e, int scaledX, int scaledY) { int action = e.getAction() & MotionEvent.ACTION_MASK; jumpButton.onTouchDown(scaledX, scaledY); actionButton.onTouchDown(scaledX, scaledY); rightButton.onTouchDown(scaledX, scaledY); leftButton.onTouchDown(scaledX, scaledY); pauseButton.onTouchDown(scaledX, scaledY); switch (action) { case MotionEvent.ACTION_DOWN: { int id = e.getPointerId(0); Log.d("Play", "Pointer Down [" + id + "]"); if (gamePaused) { gamePaused = false; } if (jumpButton.isPressed(scaledX, scaledY)) { player.jump(); } else if (actionButton.isPressed(scaledX, scaledY)) { Log.d("Play", "Action!"); } else if (rightButton.isPressed(scaledX, scaledY)) { player.moveRight(); } else if (leftButton.isPressed(scaledX, scaledY)) { player.moveLeft(); } else if (pauseButton.isPressed(scaledX, scaledY)) { onPause(); } break; } case MotionEvent.ACTION_POINTER_DOWN: { int id = e.getPointerId(getIndex(e)); Log.d("Play", "Other pointer down [" + id + "]"); if (jumpButton.isPressed(scaledX, scaledY)) { player.jump(); } else if (actionButton.isPressed(scaledX, scaledY)) { Log.d("Play", "Action!"); } else if (rightButton.isPressed(scaledX, scaledY)) { player.moveRight(); } else if (leftButton.isPressed(scaledX, scaledY)) { player.moveLeft(); } else if (pauseButton.isPressed(scaledX, scaledY)) { onPause(); } break; } case MotionEvent.ACTION_UP: { int id = e.getPointerId(0); Log.d("Play", "Pointer up [" + id + "]"); if (jumpButton.isPressed(scaledX, scaledY)) { jumpButton.cancel(); } else if (actionButton.isPressed(scaledX, scaledY)) { actionButton.cancel(); } else if (rightButton.isPressed(scaledX, scaledY)) { player.stop(); Tile.stop(); rightButton.cancel(); } else if (leftButton.isPressed(scaledX, scaledY)) { player.stop(); Tile.stop(); leftButton.cancel(); } else if (pauseButton.isPressed(scaledX, scaledY)) { pauseButton.cancel(); } else { player.stop(); Tile.stop(); jumpButton.cancel(); actionButton.cancel(); rightButton.cancel(); leftButton.cancel(); pauseButton.cancel(); } break; } case MotionEvent.ACTION_POINTER_UP: { int id = e.getPointerId(getIndex(e)); Log.d("Play", "Other pointer up [" + id + "]"); if (jumpButton.isPressed(scaledX, scaledY)) { jumpButton.cancel(); } else if (actionButton.isPressed(scaledX, scaledY)) { actionButton.cancel(); } else if (rightButton.isPressed(scaledX, scaledY)) { player.stop(); Tile.stop(); rightButton.cancel(); } else if (leftButton.isPressed(scaledX, scaledY)) { player.stop(); Tile.stop(); leftButton.cancel(); } else if (pauseButton.isPressed(scaledX, scaledY)) { pauseButton.cancel(); } else { player.stop(); Tile.stop(); jumpButton.cancel(); actionButton.cancel(); rightButton.cancel(); leftButton.cancel(); pauseButton.cancel(); } break; } } return true; } private int getIndex(MotionEvent e) { int idx = (e.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; return idx; }