Медленно вращающийся объект с помощью сенсорной панели 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 - текущее направление, в котором они удерживаются. Если у кого-то есть еще более простое решение, я бы все равно хотел знать, как Я, вероятно, буду использовать что-то очень похожее в будущем.