java - studio - libgdx ubuntu
Movimiento Java LibGDX Multi Touch (1)
Dos errores saltan hacia mí:
getY()
lugar degetY(i)
en un par de lugares, por lo que los criterios están mezclados para cualquier puntero además del más reciente.Lo envuelve todo en un bucle que se ejecuta 20 veces, por lo que está moviendo a cada jugador 20 veces un fotograma en lugar de una vez cada uno, como máximo. El movimiento debe aplicarse fuera del ciclo.
Este problema es más complicado de lo que parece inicialmente, porque tiene que lidiar con el rechazo de los dedos adicionales en cualquier lado de la pantalla. Supongamos que el puntero 1 es un dedo en la mitad superior de la pantalla. Si el puntero 2 es un dedo en la mitad superior, quiere rechazarlo, pero si está en la mitad inferior, quiere usarlo para mover el reproductor 2. Si los punteros 1 y 2 están en la parte superior, quiere aceptar puntero 3 solo si está en la parte inferior pero desea rechazarlo siempre si los punteros 1 y 2 están en lados opuestos.
Además, si solo un dedo está hacia abajo, pero se desliza a través del límite hacia el otro lado, debes asegurarte de no permitir que comience a controlar al jugador contrario.
Aquí hay una posible estrategia. Siga el primer puntero hacia abajo en cada lado y reinícielo siempre que se suelte el puntero seguido. Solo actualice las posiciones de destino para los dos punteros actualmente rastreados.
private int player1Pointer = -1, player2Pointer = -1;
// render():
//stop tracking released fingers
if (player1Pointer >=0 && !Gdx.input.isTouched(player1Pointer))
player1Pointer = -1;
if (player2Pointer >=0 && !Gdx.input.isTouched(player2Pointer))
player2Pointer = -1;
//check for new pointers and update target positions
for (int i = 0; i<20; i++){
if (!Gdx.input.isTouched(i))
continue;
if (Gdx.input.getY(i) <= 400){ //bottom, player 1
if (player2Pointer == i)
continue; //player 2 slid finger across boundary, ignore it
if (player1Pointer < 0)
player1Pointer = i; //first finger down on this side of screen, track it
if (player1Pointer == i){ //this is the tracked finger, update target
player1TouchPosition.set(Gdx.input.getX(i), Gdx.input.getY(i), 0);
camera.unproject(player1TouchPosition);
}
} else { //top, player 2
if (player1Pointer == i)
continue;
if (player2Pointer < 0)
player2Pointer = i;
if (player2Pointer == i){
player2TouchPosition.set(Gdx.input.getX(i), Gdx.input.getY(i), 0);
camera.unproject(player2TouchPosition);
}
}
}
//update movement toward targets
maxDistance = 10 * Gdx.graphics.getDeltaTime();
temp.set(player1TouchPosition.x, player1TouchPosition.y).sub(player1Rectangle.x, player1Rectangle.y);
if (temp.len() <= maxDistance) {
player1Rectangle.x = player1TouchPosition.x;
player1Rectangle.y = player1TouchPosition.y;
} else {
temp.nor().scl(maxDistance);
player1Rectangle.x += temp.x;
player1Rectangle.y += temp.y;
}
temp.set(player2TouchPosition.x, player2TouchPosition.y).sub(player2Rectangle.x, player2Rectangle.y);
if (temp.len() <= maxDistance) {
player2Rectangle.x = player2TouchPosition.x;
player2Rectangle.y = player2TouchPosition.y;
} else {
temp.nor().scl(maxDistance);
player2Rectangle.x += temp.x;
player2Rectangle.y += temp.y;
}
¿Cuál es el problema? Estoy usando este código para el movimiento de dos jugadores. Pero no está funcionando. Player1 es más rápido que player2. ¿Cómo puedo arreglarlo?
for (byte i = 0; i < 20; i++) {maxDistance = 10 * Gdx.graphics.getDeltaTi
me();
if (Gdx.input.isTouched(i) && Gdx.input.getY()<= 400) {
player1TouchPosition.set(Gdx.input.getX(i), Gdx.input.getY(i), 0);
camera.unproject(player1TouchPosition);
}
player1Tmp.set(player1TouchPosition.x, player1TouchPosition.y).sub(player1Rectangle.x, player1Rectangle.y);
if (player1Tmp.len() <= maxDistance) {
player1Rectangle.x = player1TouchPosition.x;
player1Rectangle.y = player1TouchPosition.y;
} else {
player1Tmp.nor().scl(maxDistance);
player1Rectangle.x += player1Tmp.x;
player1Rectangle.y += player1Tmp.y;
}
if (Gdx.input.isTouched(i) && Gdx.input.getY() >= 401) {
player2TouchPosition.set(Gdx.input.getX(i), Gdx.input.getY(i), 0);
camera.unproject(player2TouchPosition);
}
player2Tmp.set(player2TouchPosition.x, player2TouchPosition.y).sub(player2Rectangle.x, player2Rectangle.y);
if (player2Tmp.len() <= maxDistance) {
player2Rectangle.x = player2TouchPosition.x;
player2Rectangle.y = player2TouchPosition.y;
} else {
player2Tmp.nor().scl(maxDistance);
player2Rectangle.x += player2Tmp.x;
player2Rectangle.y += player2Tmp.y;
}
}