Я пытаюсь заставить игрока вращаться и сталкиваться с целевой позицией, и столкнулся с проблемой, которую я не могу исправить.Libgdx, вращающийся к углу с Vector2s
Когда корабль вращается в направлении целевого положения, когда он достигает непосредственно под целевым положением, он сходит с ума и движется влево и вправо, идя вниз (вдали от позиции цели) и в конечном итоге от экрана.
Я не хочу ограничивать экран, поскольку он будет выглядеть странным, когда он медленно вращается, если он находится вблизи предела экрана. В этом случае, если я ограничу экран, он все равно застрянет внизу, поскольку он продолжает поворачиваться влево и вправо. Я загрузил изображение на imgur, чтобы попытаться лучше объяснить мою проблему.
Желтый корабль направления движения (он вращается в направлении целевого положения, но пересекает красную линию), зеленый - это воображаемый вектор в направлении целевого положения, красный - другой воображаемый вектор, который представляет всякий раз, когда корабль сходит с ума. Когда зеленая линия идет вверх по красной линии, корабль начинает выходить из строя и выходить на экран.
public void ai() {
switch (playerArrived()) {
case 0:
break;
case 1:
pTargetPos.set(ran(0, Gdx.graphics.getWidth()), ran(0, Gdx.graphics.getHeight()));
System.out.println("Player Destination Reached: " + pPos.x + "," + pPos.y + " Moving to new point: " + pTargetPos.x + "," + pTargetPos.y);
break;
}
turn();
move();
ePlayerBody.set(pPos.x, pPos.y, pWidth);
}
public int playerArrived() {
if (pTargetPos.x < pPos.x + pWidth && pTargetPos.x > pPos.x - pWidth && pTargetPos.y < pPos.y + pHeight && pTargetPos.y > pPos.y - pHeight) {
return 1;
} else {
return 0;
}
}
public float ran(float low, float high) {
return (float) (Math.random() * (high - low + 1)) + low;
}
public void move() {
pVel.set(pTargetPos.x - pPos.x, pTargetPos.y - pPos.y);
pVel.nor();
pVel.x *= sMaxSpeed + Gdx.graphics.getDeltaTime();
pVel.y *= sMaxSpeed + Gdx.graphics.getDeltaTime();
pVel.setAngle(pNewRotation + 90);
pPos.add(pVel);
}
public void turn() {
pRotation = ((Math.atan2(pTargetPos.x - pPos.x, -(pTargetPos.y - pPos.y)) * 180.0d/Math.PI)+180.0f);
pNewRotation += (pRotation - pNewRotation) * Gdx.graphics.getDeltaTime();
System.out.println(pRotation+" "+pNewRotation);
}
Я загрузил изображение на Imgur, чтобы попытаться лучше объяснить мою проблему
Первый вопрос: Javadoc для 'Math.atan2()' говорит, что первый аргумент 'y' и второй аргумент' x'. Вы, кажется, называете это в обратном порядке ... вы уверены, что это то, что вы хотите? – dcsohl