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:
- Multitouch para Android obteniendo punteros erróneos y / o valores XY
- Cómo codificar para multitouch
- Detección de pinch en Android
- Juego de Multitouch de Android
- Activar / desactivar el zoom en Android WebView
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
“
- multitouch androide, el puntero de acción no funciona correctamente
- Multitouch de Android! Hackear a alguien
- Multitouch para Android: ACTION_UP no siempre se llama?
- Androide multitouch imagen zoom?
- Consulta el número exacto de punteros compatibles con multitouch
- MotionEvent.getPointerCount () siempre es 1
- ¿Cómo habilitar Scale en Android ScrollView de una manera que no impide que se desplace y haga clic en sus elementos secundarios?
- Imagen multitáctil que reproduce sonido después de una secuencia determinada
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.
- Rotación de imagen con opencv en android corta los bordes de una imagen
- Android: genera una intención simulada y devuelve algunos datos de intenciones