LibGDX画像の回転の問題

Sapphire20:

私はイメージ(Imageクラス)を回転させたとき、私は小さな問題で助けを必要としています。

アイデアは、球状の画像を回転させることである、動きが指のタッチとドラッグであり、それはあるかない時計回りにも、これまでのところ、これは正常に動作します。

私は球の角度が90の倍数である場合に発生するために何かをしたい、問題は、私は時々私の指で球を回転させたときに、それは球の角度が常に90の倍数を通過しないように高速であることで、それが87であれば、私の指を動かしたときに、たとえば、それが90に触れることなく94になります。

これは、ドラッグによって回転のために私のコードです

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

私はこれを捕獲するための最良の方法は、1により回転を増やすことが、私は回転イベント、あなたの助けに感謝をキャプチャするより良い方法があるかどうかを知りたかったので、これは、指の速度に追従しませんでしょう知っています。

更新

私は簡単に私が必要なものを表現することができるように迅速なイメージを作りました: ここでは、画像の説明を入力します。

状況:(灰色球は黄色球の現在の角度を表している)私は黄色ダイヤルを右に回す、黄色球体の角度が90の倍数である場合、イベントxが発生する、あなたが球を回転させ続けることができますイベントでは、あなたが同じイベントが再び起こるだろう90の次の倍数に取得することを回し続けるならば、私はオブジェクトの現在の角度に角度の量を加算rotateByメソッドを使用しますので、問題が発生していることである一方、私は速すぎて球を移動した場合、その角度は90の倍数に達することを防止することが、同様に私が前に言った、これは単純に1ずつ増加することにより補正することができることをジャンプしますが、球ははるかに遅い私の指よりも行くだろう。

私は必要なの球の角度は多分90の倍数を使用して、それを検出し、関係なく、あなたが球を動かしどれだけ速くこれらの4辺の1を見ていないときに発生するイベントのためにどの辺を知るための最良の方法ではありません角度は上にある、または多分私はrotateBy以外の方法を使用する必要がありますか?

ルイス・フェルナンド・Frontanilla:

私はあなたが以前の角度を格納し、90の倍数が渡されたかどうかを確認するために、以前と新しい角度を比較お勧め:

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=372742&siteId=1