java - manejo de multitouch en libgdx
android multi-touch (1)
está 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 quiero procesar golpes para que el personaje salte, golpee o arroje algo al enemigo. Originalmente consideré usar fling en GestureListener. Sin embargo, desde entonces he sido informado de que fling no es compatible con multitouch y desde entonces he comenzado a usar pan para detectar los swipes. El problema que estoy teniendo actualmente es que si tengo un dedo en la pantalla mientras uso un deslizamiento (el jugador se mueve e intenta saltar), el puntero pasado a pan stop parece ser incorrecto (al menos basarse en mi registro y comprensión). de la implementación) de todos modos aquí está el código a continuación y un enlace a los documentos en el detector de gestos aquí si alguien puede ayudar a explicar lo que está pasando, 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 bien, este es el código relevante para detectar qué acciones se deben tomar (directionPointer y actionPointer son ints globales inicializados ad -1
) el problema es que el puntero devuelto por panStop no son como esperaba aquí hay algunos archivos de registro de salida para diferentes acciones táctiles para muestra lo que está sucediendo:
caso 1: mantenga presionada la esquina inferior izquierda de la pantalla (bob se mueve hacia la izquierda):
direction TOUCHdOWN POINTER IS: 0 action pointer->-1 directionpointer->0
case2 deslizar hacia arriba (bob salta)
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 está el problema):
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 demostrártelo, es el problema, ya que el dedo con el que se desplaza está registrado como el puntero de acción, el puntero de dirección (que no sale de la pantalla) es el que se devuelve. ¿Alguien puede decir que estoy haciendo mal o si esto es un error con libgdx o más probable es que mi código mismo
`
Lo que realmente se puede hacer es dejar que el DPAD sea un actor conectado a un escenario, mientras que los controles en pantalla se manejan en un InputProcessor o GestureListener y usar 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 se priorizaría el escenario (DPAD) antes de que los controles en pantalla. Entonces, en tu caso, probablemente quieras cambiarlos.
Soy consciente de que esta puede no ser una buena solución para ti, pero lo he estado haciendo de esta manera en algunos de mis juegos.