Libgdx tema rotación de imagen

Sapphire20:

Necesito ayuda con un pequeño problema cuando girar una imagen (la clase de imagen).

La idea consiste en hacer girar una imagen esférica, el movimiento es a través del tacto y arrastre del dedo, puede ser o no las agujas del reloj, lo que va funciona correctamente.

Quiero algo suceda cuando el ángulo de la esfera sea un múltiplo de 90, el problema es que cuando puedo rotar la esfera con el dedo a veces es tan rápido que el ángulo de la esfera no siempre va a través de los múltiplos de 90, por ejemplo, si es a los 87, cuando se mueve el dedo que va a 94 sin tocarlo 90.

Este es mi código para rotar arrastrando

tapeImage.addListener(new DragListener() {
        int initDegree;

        @Override
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
            initDegree = (int) new Vector2(x, y).sub(new Vector2(tapeImage.getOriginX(), tapeImage.getOriginY())).angle();
            return true;
        }

        @Override
        public void touchDragged(InputEvent event, float x, float y, int pointer) {
            int touchDegree = (int) (new Vector2(x, y).sub(new Vector2(tapeImage.getOriginX(), tapeImage.getOriginY()))).angle();
            tapeImage.rotateBy(touchDegree - initDegree);
        }
    });

Sé que la mejor manera de capturar este sería aumentar la rotación por 1 Pero esto no iba a seguir la velocidad del dedo, así que quería saber si hay una mejor manera de eventos de rotación de captura, gracias por su ayuda.

Actualizar

Hice una imagen rápida para poder representar fácilmente lo que necesito: introducir descripción de la imagen aquí

Situación: (La esfera gris es una representación del ángulo actual de la esfera de color amarillo) se enciende el amarillo en sentido horario, cuando el ángulo de la esfera amarilla es un múltiplo de 90, se producirá un evento x, se puede mantener la rotación de la esfera mientras que el evento se produce por lo que si se mantiene girando obtendrá al siguiente número múltiplo de 90, donde el mismo evento vuelva a suceder, yo uso el método rotateBy que añade una cantidad de ángulo para el ángulo actual del objeto, el problema es que si muevo la esfera demasiado rápido, su ángulo de saltos que le impide llegar al múltiplo de 90, como he dicho antes, esto podría ser corregido por el simple aumento de 1 por 1, pero la esfera iría mucho más lento que mi dedo.

Lo que necesito es para el evento que ocurra cuando el ángulo de la esfera está mirando a uno de esos 4 lados, no importa qué tan rápido se mueve la esfera, tal vez la detección utilizando el múltiplo de 90 no es la mejor manera de saber de qué lado de la ángulo es de, o quizás debería utilizar un método distinto rotateBy?

Luis Fernando Frontanilla :

Sugiero que almacena el ángulo anterior y comparar los ángulos anteriores y nuevos para ver si un múltiplo de 90 se ha pasado:

int previousDegree = 0;
@Override
public void touchDragged(InputEvent event, float x, float y, int pointer) {
    int touchDegree = (int) (new Vector2(x, y).sub(new Vector2(tapeImage.getOriginX(), tapeImage.getOriginY()))).angle();
    tapeImage.rotateBy(touchDegree - initDegree);
    if(previousDegree < 90 && tapeImage.getRotation() >= 90) {
        // 90 degrees passed, put code
    } else if (previousDegree < 180 && tapeImage.getRotation() >= 180) {
        // 180 degrees passed, put code
    } else if (previousDegree < 270 && tapeImage.getRotation() >= 270) {
        // 270 degrees passed, put code
    } else if (previousDegree < 360 && tapeImage.getRotation() >= 360) {
        // 360 degrees passed, put code
    }
    previousDegree = touchDegree;
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=372749&siteId=1
Recomendado
Clasificación