LibGDX image problème de rotation

Sapphire20:

J'ai besoin d'aide avec un petit problème quand je tourne une image (image classe).

L'idée est de faire pivoter une image sphérique, le mouvement est en contact et faites glisser du doigt, il peut être ou non dans le sens horaire, Jusqu'à présent, cela fonctionne correctement.

Je veux que quelque chose arrive lorsque l'angle de la sphère soit un multiple de 90, le problème est que quand je tourne la sphère avec le doigt parfois, il est si rapide que l'angle de la sphère ne va pas toujours par les multiples de 90, par exemple si elle est à 87, lors du déplacement de mon doigt, il passe à 94 sans toucher 90.

Ceci est mon code pour rotate par glisser

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);
        }
    });

Je sais que la meilleure façon de capturer ce serait d'augmenter la rotation de 1 Mais cela ne suivrais pas la vitesse du doigt, donc je voulais savoir s'il y a une meilleure façon d'événements de rotation de capture, merci pour votre aide.

Mise à jour

J'ai fait une image rapide pour être en mesure de représenter facilement ce que je dois: entrez la description d'image ici

Situation: (La sphère grise est une représentation de l'angle actuel de la sphère jaune) Je tourne dans le sens horaire de cadran jaune, lorsque l'angle de la sphère jaune est un multiple de 90, un x événement se produira, vous pouvez continuer à faire tourner la sphère tandis que l'événement se produit alors si vous continuez à vous tourner obtiendrez le nombre multiple de la prochaine 90 où à nouveau se produira le même événement, j'utilise la méthode rotateBy qui ajoute une quantité d'angle à l'angle actuel de l'objet, le problème est que si je déplace la sphère trop vite, son angle saute qui l'empêche d'atteindre le multiple de 90, Comme je l'ai déjà dit, cela pourrait être corrigé en augmentant simplement 1 par 1, mais la sphère irait beaucoup plus lent que mon doigt.

Ce que j'ai besoin est pour l'événement de se produire lorsque l'angle de la sphère est à la recherche à l'un de ces 4 côtés, peu importe la façon dont vous vous déplacez rapidement la sphère, la détection peut-être à l'aide d'un multiple de 90 n'est pas la meilleure façon de savoir de quel côté la angle est, ou peut-être que je devrais utiliser une autre méthode que rotateBy?

Luis Fernando Frontanilla:

Je vous suggère de stocker l'angle précédent et de comparer les angles anciens et nouveaux pour voir si un multiple de 90 a été adoptée:

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;
}

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=372743&siteId=1
conseillé
Classement