Manejo multitouch en libgdx

Bien, así que he estado tratando de implementar una solución multitáctil para mi juego libgdx y tener algunos problemas. Básicamente tengo un dpad en el cuadrante inferior izquierdo de la pantalla que controla la dirección de mi personaje y en la parte restante de la pantalla quiere procesar swipes para que el personaje salte, golpee o lance algo al enemigo. Inicialmente pensé en usar fling en GestureListener Sin embargo, desde entonces he sido informado de que fling no es compatible en multitouch y desde entonces han comenzado a utilizar pan para detectar los swipes. El problema que tengo actualmente es que si tengo un dedo en la pantalla mientras uso un golpe (el jugador se está moviendo y tratando de saltar), el puntero pasado a la parada de panorámica parece ser incorrecto (por lo menos basse en mi registro y comprensión De la implementación) de todos modos aquí está el código de abajo y un enlace a los documentos sobre el detector de gestos aquí si alguien puede ayudar a explicar lo que está pasando en lo que sería muy apreciado.

@Override public boolean touchDown(float x, float y, int pointer, int button) { if (x < width / 3 && y > height / 2) { directionPointer= pointer; if(x< width/6){ controller.leftPressed(); message=" driection TOUCH DOWN POINTER IS: " + pointer + "the action pointer -> " +actionPointer +"directionPointer->"+ directionPointer; Gdx.app.log("INFO", message); return true; }else{oller.rightPressed(); message=" direction TOUCH DOWN POINTER IS: " + pointer + "the action pointer -> " +actionPointer +"directionPointer->"+ directionPointer; Gdx.app.log("INFO", message); return true; } }else{ actionPointer= pointer; down_x=x; down_y=y; message= "Pointer value is" + actionPointer; } message="TOUCH DOWN POINTER IS: " + pointer + "the action pointer -> " +actionPointer +"directionPointer->"+ directionPointer; Gdx.app.log("INFO", message); return false; } @Override public boolean touchUp(int x, int y, int pointer, int button) { if ( pointer == directionPointer) { controller.leftReleased(); controller.rightReleased(); directionPointer=-1; return true; } if (x < width / 3 && y > height / 2) { controller.leftReleased(); controller.rightReleased(); directionPointer=-1; message= "TOUCHUP pointer is ->"+ pointer + "actionPointer->"+ actionPointer + "directionPointer-> "+ directionPointer; Gdx.app.log("INFO", message); return true; } message= "touchUP was detected"; Gdx.app.log("INFO", message); return false; } @Override public boolean panStop(float x, float y, int pointer, int button) { message="swipe not processed"; if( pointer==actionPointer){ delta_x= Math.abs(down_x -x); delta_y= Math.abs(down_y - y); if (delta_x < delta_y ){ // this is an up or down value if(down_x > x){ controller.bobPunch(); message = "SWIPE DOWNWARD " ; }else { // swipe up controller.bobJump(); message = "SWIPE UPWARD " ; } }else{ if(down_y< y){ controller.throwPressed(); message=" SWIPE RIGHT"; //swipe right ward }else{ controller.throwPressed(); message=" SWIPE LEFT"; // swipe left } } } Gdx.app.log("INFO", message); message="panstop pointer is : " + pointer + "the action pointer-> " +actionPointer + "directionPointer->" + directionPointer; Gdx.app.log("INFO", message); actionPointer=-1; // TODO Auto-generated method stub return true; } 

Ahora este es el código relevante para detectar qué acciones deben tomarse (directionPointer y actionPointer son ints globales iniciados ad -1 ) el problema es que el puntero devuelto por panStop no son como esperaba aquí son algunos archivos de registro de salida para diferentes acciones táctiles a Mostrar lo que está sucediendo:

Caso 1: mantenga presionada la esquina inferior izquierda de la pantalla (bob se mueve a la izquierda):

 direction TOUCHdOWN POINTER IS: 0 action pointer->-1 directionpointer->0 

Caso2 deslizar hacia arriba (saltos de bob)

 TOUCHdOWN POINTER IS: 0 action pointer->0 directionpointer->-1 SWIPE UPWARD panstop pointer is: 0 actionpointer->0 directionpointer->-1 

Caso 3 mover y saltar (aquí es donde el problema es):

 direction TOUCHdOWN POINTER IS: 0 action pointer->-1 directionpointer->0 TOUCHdOWN POINTER IS: 1 action pointer->1 directionpointer->0 swipe not processed panstop pointer is: 0 actionpointer->1 directionpointer->0 

Ahora la última línea aunque no puedo demostrarlo a usted es el problema pues el dedo que hago pan con se registra como el puntero de la acción el indicador para la dirección (que no deja la pantalla) es el que se volvió. ¿Puede alguien señalar wht que estoy haciendo mal o si esto es un error con libgdx en sí o más probable que mi propio código

Lo que realmente podría hacer es dejar que el DPAD sea un actor conectado a una etapa, mientras que los controles en pantalla se manejan con un InputProcessor o GestureListener y utilizan un InputMultiplexer para combinarlos:

 InputMultiplexer im = new InputMultiplexer(stage, inputProcessor); Gdx.input.setInputProcessor(im); 

También si no me equivoco, el orden de los parámetros enviados al InputMultiplexer cuenta como prioridades. Lo que significa que en el caso anterior la Etapa (DPAD) sería priorizada antes de los controles en pantalla. Así que en su caso, es probable que desee cambiarlos.

Soy consciente de que esto podría no ser una buena solución para usted, pero lo he estado haciendo de esta manera en algunos de mis juegos.

  • ¿Se admite multi-touch / gestos en todos los navegadores de teléfonos inteligentes (Android e iOS)?
  • Interferencia multitáctil para Android
  • Multitouch de Android en dispositivos compatibles
  • ¿Cómo puedo probar multi-touch en Android Emulator?
  • Android: Multi toque y TYPE_SYSTEM_OVERLAY
  • Android Multitouch - Determina qué dedo levantado?
  • Grifos multi-touch de dos dedos
  • Android Libraries para la implementación de Multi Touch fácil que incluye Twist / Rotate etc?
  • Android - ¿Cómo puedo obtener información de pantalla táctil sin procesar?
  • Deshabilitar o evitar el multitouch en Actividad
  • Androide ndk multitouch
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.