Медленно вращающийся объект с помощью сенсорной панели LibGdx

Я следовал видеоинструкции на Youtube, чтобы создать игру Asteroids с LibGdx, человек, который сделал видео, не имел сенсорных элементов управления, поскольку они просто делали это для настольной версии. Мне удалось использовать тачпад LibGdx, и он почти заработал, но с некоторыми проблемами при вращении корабля.

Моя сенсорная панель показывает значения от - пи до + пи в зависимости от угла (правая сторона равна 0, нижняя часть - отрицательные значения, верхняя часть - положительная). То же самое касается направления, в котором сейчас находится корабль.

Проблема заключается в том, что, поскольку корабль медленно вращается, если вы находитесь на левой стороне и меняете сенсорную панель с -pi на + pi, корабль будет вращаться по длинному пути. Каждое решение, которое я придумал, вызывало проблему еще где. Мое последнее решение ниже, я думал, сработало, но имеет ту же проблему только в другой области.

радианы - это направление, в котором сейчас находится корабль. touchPadDirection - это направление удержания сенсорной панели. Оба в радианах.

    if (radians < touchPadDirection ){
        if( radians - touchPadDirection < MathUtils.PI && touchPadDirection >  MathUtils.PI /2 && radians <  MathUtils.PI /2 ) {
            System.out.println("1st choice");
            setRight(true);
            setLeft(false);
        }else{
            System.out.println("3rd choice");
            setLeft(true);
            setRight(false);
        }
    }
    if (radians > touchPadDirection) {
        if( radians - touchPadDirection > MathUtils.PI && touchPadDirection <  MathUtils.PI /2 && radians >  MathUtils.PI /2) {
            System.out.println("2nd choice");
            setRight(false);
            setLeft(true);
        }else{
            System.out.println("4th choice");
            setRight(true);
            setLeft(false);                 
        }
    }
}

Единственные проблемы с вращением, которые я обнаружил в Google, похоже, помогают, если элемент вращается мгновенно, так как он будет направлен только в направлении корабля. Поэтому мне нужно как-то заставить его постоянно вращаться в правильном направлении (всегда вращаться в любом направлении, которое будет наиболее быстрым). Помните, что значения находятся в диапазоне от -3,14 до 3,14, и первоначальная проблема возникает, когда небольшое изменение приводит к тому, что корабль поворачивает на большие расстояния.

Я не лучший в объяснении, так что, надеюсь, кто-то понимает, чего я пытаюсь достичь, и спасибо заранее.

1 ответ

Решение

Я думаю, что я разобрался, проверил это много, и все, кажется, работает правильно.

public void rotate(float touchPadDirection) {
    if (radians > 0 && touchPadDirection < radians - MathUtils.PI){
        setLeft(true);
        setRight(false);
    }else if (radians < 0 && touchPadDirection > radians + MathUtils.PI){
        setLeft(false);
        setRight(true);
    }else if (touchPadDirection > radians){
        setLeft(true);
        setRight(false);
    }else if (touchPadDirection < radians){
        setLeft(false);
        setRight(true);
    }
}

Как и во всем, решение всегда проще, чем большинство вещей, которые я пробую, Как и прежде, радианы - это текущее направление корабля игрока, а touchPadDirection - текущее направление, в котором они удерживаются. Если у кого-то есть еще более простое решение, я бы все равно хотел знать, как Я, вероятно, буду использовать что-то очень похожее в будущем.

Другие вопросы по тегам