#debugging #libgdx #line #shapes
Вопрос:
Я работаю над игрой в LibGDX. Прямо сейчас я работаю над тем, чтобы провести линию от текущего положения тела движущегося объекта в направлении, в котором он движется. Может быть, я неправильно выразился, так что вот мое очень художественное представление того, о чем я говорю.
Проблема, с которой я сталкиваюсь, заключается в том, что вертикальные линии всегда намного длиннее диагональных линий, а диагональные линии всегда намного длиннее горизонтальных линий. Я хочу, чтобы линия, проецируемая из объекта, всегда была одинаковой длины независимо от направления.
Ниже приведен код, используемый для рисования линий из центра тела объекта. Как вы можете видеть, я масштабирую линию (например, на 25,0 f). Может быть, есть формула, которую я мог бы использовать для динамического изменения этого скаляра в зависимости от направления?
public class BodyMovementProjection implements Updatable {
public final Body body;
public final ShapeRenderer shapeRenderer;
public boolean debugProjection = false;
public float scalar = 25.0f;
private final Vector2 posThisFrame = new Vector2();
private final Vector2 posLastFrame = new Vector2();
private final Vector2 projection = new Vector2();
private float[] debugColorVals = new float[4];
public BodyMovementProjection(Body body) {
this.body = body;
this.shapeRenderer = body.entity.gameScreen.shapeRenderer;
} // BodyMovementProjection constructor
@Override
public void update() {
body.aabb.getCenter(posThisFrame);
posLastFrame.set(posThisFrame).sub(body.bodyMovementTracker.getSpritePosDelta());
projection.set(posThisFrame).sub(posLastFrame).scl(scalar).add(posLastFrame);
if (debugProjection) {
shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
shapeRenderer.setColor(debugColorVals[0], debugColorVals[1], debugColorVals[2], debugColorVals[3]);
shapeRenderer.line(posLastFrame, projection);
shapeRenderer.end();
} // if
} // update
public void setDebugColorVals(float r, float g, float b, float a) {
debugColorVals[0] = r;
debugColorVals[1] = g;
debugColorVals[2] = b;
debugColorVals[3] = a;
} // setDebugColorVals
} // BodyMovementProjection
Ответ №1:
Нормализуйте перед масштабированием. Нормализуя, вы делаете вектор направления 1 единицей длины, а масштабируя его после на 25, вы каждый раз получаете вектор, равный 25 единицам, независимо от того, как далеко друг от друга находятся текущая и предыдущая позиции.
Комментарии:
1. Я даже не подумал об этом. Спасибо, я разберусь с этим. (Я новичок здесь, работаю над первой игрой в LibGDX в свободное время. Я определенно заржавел в своей геометрии и алгебре!)