Por conveniencia, siempre probaba directamente en el Desktop usando el trackpad. Con ese tipo de control es fácil manejar todo, pero cuando cambias a pantalla móvil, es una experiencia totalmente diferente.
Es bien incómodo para los dedos rodear la pantalla completa para lograr cubrir todo ángulo del enemigo. Por eso me vi obligado a codificar un control virtual que imita las palancas de los gabinetes de los juegos de arcade.
Este tipo de control no es nada nuevo, pero lo que hace este código diferente es que la palanca no es estática. Un «Joystick» en vida real te indica los límites de movimiento, pero virtualmente no existen esos límites. Por eso codifiqué mi versión de tal forma que si continúas moviendo, el control persigue tu posición y se ajusta al lugar actual.
Joystick virtual no estático.
public VirtualJoystick() {
setTouchable(Touchable.disabled);
setSize(joystick.w, joystick.h);
}
La clase principal no maneja ninguna entrada de usuario porque es irrelevante. El control aparece cuando y donde el usuario toca la pantalla y reacciona al movimiento independiente de su posición.
La clase tiene tres partes: el actor principal, invisible; la base del control y la palanca. Cuando el usuario toca la pantalla, guardo el estado y configuro todas las partes en la posición táctil.
public void onStageTouchUp() {
visible = false;
}
Las variables «center» y «stick» son Vector2 y las uso para el cálculo de movimiento.
public void onStageTouchDown(Vector2 touch) {
visible = true;
setOriginBasedPosition(touch.x, touch.y);
joystick.setOriginBasedPosition(touch.x, touch.y);
joystickKnob.setOriginBasedPosition(touch.x, touch.y);
center.set(touch.x, touch.y);
stick.set(center);
}
Cuando el usuario deja de tocar la pantalla, guardo el estado y nada se dibuja en pantalla.
@Override
public void draw(Batch batch, float parentAlpha) {
super.draw(batch, parentAlpha);
if (visible) {
batch.draw(joystick.textureRegion, joystick.x, joystick.y);
batch.draw(joystickKnob.textureRegion, joystickKnob.x, joystickKnob.y);
}
}
En el módulo de «onStageDragged» es donde está el cálculo principal. Aquí se calcula si la palanca está dentro del límite de la base y si sobrepasa, pues también muevo la base para facilitar el control. Es aquí donde deja de ser estático porque se adapta siempre a la posición actual del usuario.
public void onStageDragged(Vector2 touch) {
diff.set(touch).sub(center);
float currentDistance = diff.len();
if (currentDistance > maxDistance) {
temp.set(diff).nor().scl(currentDistance - maxDistance);
center.add(temp);
joystick.setOriginBasedPosition(center.x, center.y);
setOriginBasedPosition(center.x, center.y);
diff.nor().scl(maxDistance);
stick.set(center).add(diff);
} else stick.set(touch);
}
Y así se ve:


Deja una respuesta